Commit 5f68d59e authored by Natalia Tepluhina's avatar Natalia Tepluhina

Merge branch 'nfriend-update-create-release-feature-spec' into 'master'

Update feature spec for release creation

See merge request gitlab-org/gitlab!56004
parents bb281ac6 979fe277
......@@ -141,6 +141,7 @@ export default {
:value="link.url"
type="text"
class="form-control"
name="asset-url"
:state="isUrlValid(link)"
@change="updateUrl(link, $event)"
@keydown.ctrl.enter="updateUrl(link, $event.target.value)"
......@@ -180,6 +181,7 @@ export default {
:value="link.name"
type="text"
class="form-control"
name="asset-link-name"
:state="isNameValid(link)"
@change="updateName(link, $event)"
@keydown.ctrl.enter="updateName(link, $event.target.value)"
......@@ -202,6 +204,7 @@ export default {
ref="typeSelect"
:value="link.linkType || $options.defaultTypeOptionValue"
class="form-control pr-4"
name="asset-type"
:options="$options.typeOptions"
@change="updateAssetLinkType({ linkIdToUpdate: link.id, newType: $event })"
/>
......
......@@ -36,8 +36,8 @@ RSpec.describe 'User creates release', :js do
expect(page.find('[data-testid="create-from-field"] .ref-selector button')).to have_content(project.default_branch)
end
context 'when the "Save release" button is clicked', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/297507' do
let(:tag_name) { 'v1.0' }
context 'when the "Save release" button is clicked' do
let(:tag_name) { 'v2.0.31' }
let(:release_title) { 'A most magnificent release' }
let(:release_notes) { 'Best. Release. **Ever.** :rocket:' }
let(:link_1) { { url: 'https://gitlab.example.com/runbook', title: 'An example runbook', type: 'runbook' } }
......@@ -47,7 +47,7 @@ RSpec.describe 'User creates release', :js do
fill_out_form_and_submit
end
it 'creates a new release when "Create release" is clicked', :aggregate_failures do
it 'creates a new release when "Create release" is clicked and redirects to the release\'s dedicated page', :aggregate_failures do
release = project.releases.last
expect(release.tag).to eq(tag_name)
......@@ -65,10 +65,6 @@ RSpec.describe 'User creates release', :js do
link = release.links.find { |l| l.link_type == link_2[:type] }
expect(link.url).to eq(link_2[:url])
expect(link.name).to eq(link_2[:title])
end
it 'redirects to the dedicated page for the newly created release' do
release = project.releases.last
expect(page).to have_current_path(project_release_path(project, release))
end
......@@ -116,30 +112,27 @@ RSpec.describe 'User creates release', :js do
end
def fill_out_form_and_submit
fill_tag_name(tag_name)
select_new_tag_name(tag_name)
select_create_from(branch.name)
fill_release_title(release_title)
select_milestone(milestone_1.title, and_tab: false)
select_milestone(milestone_1.title)
select_milestone(milestone_2.title)
# Focus the "Release notes" field by clicking instead of tabbing
# because tabbing to the field requires too many tabs
# (see https://gitlab.com/gitlab-org/gitlab/-/issues/238619)
find_field('Release notes').click
fill_release_notes(release_notes)
# Tab past the "assets" documentation link
focused_element.send_keys(:tab)
fill_asset_link(link_1)
add_another_asset_link
fill_asset_link(link_2)
# Submit using the Control+Enter shortcut
focused_element.send_keys([:control, :enter])
# Click on the body in order to trigger a `blur` event on the current field.
# This triggers the form's validation to run so that the
# "Create release" button is enabled and clickable.
page.find('body').click
click_button('Create release')
wait_for_all_requests
end
......
# frozen_string_literal: true
# These helpers fill fields on the "New Release" and
# "Edit Release" pages. They use the keyboard to navigate
# from one field to the next and assume that when
# they are called, the field to be filled out is already focused.
# These helpers fill fields on the "New Release" and "Edit Release" pages.
#
# Usage:
# describe "..." do
......@@ -18,97 +15,65 @@ module Spec
module Helpers
module Features
module ReleasesHelpers
# Returns the element that currently has keyboard focus.
# Reminder that this returns a Selenium::WebDriver::Element
# _not_ a Capybara::Node::Element
def focused_element
page.driver.browser.switch_to.active_element
end
def fill_tag_name(tag_name, and_tab: true)
expect(focused_element).to eq(find_field('Tag name').native)
def select_new_tag_name(tag_name)
page.within '[data-testid="tag-name-field"]' do
find('button').click
focused_element.send_keys(tag_name)
wait_for_all_requests
focused_element.send_keys(:tab) if and_tab
end
find('input[aria-label="Search or create tag"]').set(tag_name)
def select_create_from(branch_name, and_tab: true)
expect(focused_element).to eq(find('[data-testid="create-from-field"] button').native)
wait_for_all_requests
focused_element.send_keys(:enter)
click_button("Create tag #{tag_name}")
end
end
# Wait for the dropdown to be rendered
page.find('.ref-selector .dropdown-menu')
def select_create_from(branch_name)
page.within '[data-testid="create-from-field"]' do
find('button').click
# Pressing Enter in the search box shouldn't submit the form
focused_element.send_keys(branch_name, :enter)
wait_for_all_requests
# Wait for the search to return
page.find('.ref-selector .dropdown-item', text: branch_name, match: :first)
find('input[aria-label="Search branches, tags, and commits"]').set(branch_name)
focused_element.send_keys(:arrow_down, :enter)
wait_for_all_requests
focused_element.send_keys(:tab) if and_tab
click_button("#{branch_name}")
end
def fill_release_title(release_title, and_tab: true)
expect(focused_element).to eq(find_field('Release title').native)
focused_element.send_keys(release_title)
focused_element.send_keys(:tab) if and_tab
end
def select_milestone(milestone_title, and_tab: true)
expect(focused_element).to eq(find('[data-testid="milestones-field"] button').native)
focused_element.send_keys(:enter)
# Wait for the dropdown to be rendered
page.find('.milestone-combobox .dropdown-menu')
def fill_release_title(release_title)
fill_in('Release title', with: release_title)
end
# Clear any existing input
focused_element.attribute('value').length.times { focused_element.send_keys(:backspace) }
def select_milestone(milestone_title)
page.within '[data-testid="milestones-field"]' do
find('button').click
# Pressing Enter in the search box shouldn't submit the form
focused_element.send_keys(milestone_title, :enter)
wait_for_all_requests
# Wait for the search to return
page.find('.milestone-combobox .dropdown-item', text: milestone_title, match: :first)
find('input[aria-label="Search Milestones"]').set(milestone_title)
focused_element.send_keys(:arrow_down, :arrow_down, :enter)
wait_for_all_requests
focused_element.send_keys(:tab) if and_tab
find('button', text: milestone_title, match: :first).click
end
def fill_release_notes(release_notes, and_tab: true)
expect(focused_element).to eq(find_field('Release notes').native)
focused_element.send_keys(release_notes)
# Tab past the links at the bottom of the editor
focused_element.send_keys(:tab, :tab, :tab) if and_tab
end
def fill_asset_link(link, and_tab: true)
expect(focused_element['id']).to start_with('asset-url-')
focused_element.send_keys(link[:url], :tab, link[:title], :tab, link[:type])
def fill_release_notes(release_notes)
fill_in('Release notes', with: release_notes)
end
# Tab past the "Remove asset link" button
focused_element.send_keys(:tab, :tab) if and_tab
def fill_asset_link(link)
all('input[name="asset-url"]').last.set(link[:url])
all('input[name="asset-link-name"]').last.set(link[:title])
all('select[name="asset-type"]').last.find("option[value=\"#{link[:type]}\"").select_option
end
# Click "Add another link" and tab back to the beginning of the new row
def add_another_asset_link
expect(focused_element).to eq(find_button('Add another link').native)
focused_element.send_keys(:enter,
[:shift, :tab],
[:shift, :tab],
[:shift, :tab],
[:shift, :tab])
click_button('Add another link')
end
end
end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment