From d399afc9469f16074f863043d2e64e12dd6b4a87 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 27 Apr 2022 03:10:49 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .../creations/_new_compare.html.haml | 4 ++-- .../empty_states/_merge_requests.html.haml | 2 +- qa/qa/flow/merge_request.rb | 20 +++++++++++++++++++ qa/qa/page/base.rb | 9 +++++++++ qa/qa/page/merge_request/index.rb | 17 ++++++++++++++++ qa/qa/page/merge_request/new.rb | 15 ++++++++++++++ qa/qa/page/project/show.rb | 6 +++++- qa/qa/resource/merge_request.rb | 2 +- qa/qa/support/page/logging.rb | 6 ++++++ spec/graphql/mutations/base_mutation_spec.rb | 2 ++ .../concerns/mutations/finds_by_gid_spec.rb | 2 +- .../mutations/merge_requests/accept_spec.rb | 3 ++- .../mutations/merge_requests/create_spec.rb | 4 +++- .../keyset/connection_generic_keyset_spec.rb | 4 +++- .../pagination/keyset/connection_spec.rb | 4 +++- spec/support/helpers/graphql_helpers.rb | 4 ++++ 16 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 qa/qa/page/merge_request/index.rb diff --git a/app/views/projects/merge_requests/creations/_new_compare.html.haml b/app/views/projects/merge_requests/creations/_new_compare.html.haml index e2ac8ef5abc..811b45ef8af 100644 --- a/app/views/projects/merge_requests/creations/_new_compare.html.haml +++ b/app/views/projects/merge_requests/creations/_new_compare.html.haml @@ -22,7 +22,7 @@ selected: f.object.source_project_id .merge-request-select.dropdown = f.hidden_field :source_branch - = dropdown_toggle f.object.source_branch.presence || _("Select source branch"), { toggle: "dropdown", 'field-name': "#{f.object_name}[source_branch]", 'refs-url': refs_project_path(@source_project), selected: f.object.source_branch }, { toggle_class: "js-compare-dropdown js-source-branch monospace" } + = dropdown_toggle f.object.source_branch.presence || _("Select source branch"), { toggle: "dropdown", 'field-name': "#{f.object_name}[source_branch]", 'refs-url': refs_project_path(@source_project), selected: f.object.source_branch, qa_selector: "source_branch_dropdown" }, { toggle_class: "js-compare-dropdown js-source-branch monospace" } .dropdown-menu.dropdown-menu-selectable.js-source-branch-dropdown.git-revision-dropdown = dropdown_title(_("Select source branch")) = dropdown_filter(_("Search branches")) @@ -62,4 +62,4 @@ - if @merge_request.errors.any? = form_errors(@merge_request) - = f.submit 'Compare branches and continue', class: "gl-button btn btn-confirm mr-compare-btn" + = f.submit 'Compare branches and continue', class: "gl-button btn btn-confirm mr-compare-btn", data: { qa_selector: "compare_branches_button" } diff --git a/app/views/shared/empty_states/_merge_requests.html.haml b/app/views/shared/empty_states/_merge_requests.html.haml index d199c8e71a2..fe602db4393 100644 --- a/app/views/shared/empty_states/_merge_requests.html.haml +++ b/app/views/shared/empty_states/_merge_requests.html.haml @@ -42,4 +42,4 @@ - if project_select_button = render 'shared/new_project_item_select', path: 'merge_requests/new', label: _('merge request'), type: :merge_requests, with_feature_enabled: 'merge_requests' - else - = link_to _('New merge request'), button_path, class: 'gl-button btn btn-confirm', title: _('New merge request'), id: 'new_merge_request_link' + = link_to _('New merge request'), button_path, class: 'gl-button btn btn-confirm', title: _('New merge request'), id: 'new_merge_request_link', data: { qa_selector: "new_merge_request_button" } diff --git a/qa/qa/flow/merge_request.rb b/qa/qa/flow/merge_request.rb index c26140000fe..f1cab2c7d1a 100644 --- a/qa/qa/flow/merge_request.rb +++ b/qa/qa/flow/merge_request.rb @@ -10,6 +10,26 @@ module QA Page::Project::Settings::Main.perform(&:expand_merge_requests_settings) Page::Project::Settings::MergeRequest.perform(&:enable_merge_train) end + + # Opens the form to create a new merge request. + # It tries to use the "Create merge request" button that appears after + # a commit is pushed, but if that button isn't available, it uses the + # "New merge request" button on the page that lists merge requests. + # + # @param [String] source_branch the branch to be merged + def create_new(source_branch:) + if Page::Project::Show.perform(&:has_create_merge_request_button?) + Page::Project::Show.perform(&:new_merge_request) + return + end + + Page::Project::Menu.perform(&:click_merge_requests) + Page::MergeRequest::Index.perform(&:click_new_merge_request) + Page::MergeRequest::New.perform do |merge_request| + merge_request.select_source_branch(source_branch) + merge_request.click_compare_branches_and_continue + end + end end end end diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb index 83db8bc0fd6..491990c69e0 100644 --- a/qa/qa/page/base.rb +++ b/qa/qa/page/base.rb @@ -218,6 +218,15 @@ module QA page.validate_elements_present! if page end + # Uses capybara to locate and click an element instead of `click_element`. + # This can be used when it's not possible to add a QA selector but we still want to log the click + # + # @param [String] method the capybara method to use + # @param [String] locator the selector used to find the element + def click_via_capybara(method, locator) + page.public_send(method, locator) + end + def fill_element(name, content) find_element(name).set(content) end diff --git a/qa/qa/page/merge_request/index.rb b/qa/qa/page/merge_request/index.rb new file mode 100644 index 00000000000..ae024c16566 --- /dev/null +++ b/qa/qa/page/merge_request/index.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module QA + module Page + module MergeRequest + class Index < Page::Base + view 'app/views/shared/empty_states/_merge_requests.html.haml' do + element :new_merge_request_button + end + + def click_new_merge_request + click_element(:new_merge_request_button) + end + end + end + end +end diff --git a/qa/qa/page/merge_request/new.rb b/qa/qa/page/merge_request/new.rb index bcc60a8275d..b19a0d1a830 100644 --- a/qa/qa/page/merge_request/new.rb +++ b/qa/qa/page/merge_request/new.rb @@ -12,6 +12,11 @@ module QA element :issuable_form_description end + view 'app/views/projects/merge_requests/creations/_new_compare.html.haml' do + element :compare_branches_button + element :source_branch_dropdown + end + view 'app/views/projects/merge_requests/show.html.haml' do element :diffs_tab end @@ -27,6 +32,10 @@ module QA "to customize #{scanner_name} settings." end + def click_compare_branches_and_continue + click_element(:compare_branches_button) + end + def create_merge_request click_element(:issuable_create_button, Page::MergeRequest::Show) end @@ -43,6 +52,12 @@ module QA def has_file?(file_name) has_element?(:file_name_content, text: file_name) end + + def select_source_branch(branch) + click_element(:source_branch_dropdown) + fill_element(:dropdown_input_field, branch) + click_via_capybara(:click_on, branch) + end end end end diff --git a/qa/qa/page/project/show.rb b/qa/qa/page/project/show.rb index b234a9ba986..9983ee2a33d 100644 --- a/qa/qa/page/project/show.rb +++ b/qa/qa/page/project/show.rb @@ -120,6 +120,10 @@ module QA click_element(:new_issue_link) end + def has_create_merge_request_button? + has_css?(element_selector_css(:create_merge_request)) + end + def has_file?(name) return false unless has_element?(:file_tree_table) @@ -144,7 +148,7 @@ module QA def new_merge_request wait_until(reload: true) do - has_css?(element_selector_css(:create_merge_request)) + has_create_merge_request_button? end click_element :create_merge_request diff --git a/qa/qa/resource/merge_request.rb b/qa/qa/resource/merge_request.rb index 685cccea02d..e3d139d59ae 100644 --- a/qa/qa/resource/merge_request.rb +++ b/qa/qa/resource/merge_request.rb @@ -83,7 +83,7 @@ module QA populate_target_and_source_if_required project.visit! - Page::Project::Show.perform(&:new_merge_request) + Flow::MergeRequest.create_new(source_branch: source_branch) Page::MergeRequest::New.perform do |new_page| new_page.fill_title(@title) new_page.choose_template(@template) if @template diff --git a/qa/qa/support/page/logging.rb b/qa/qa/support/page/logging.rb index b402639b843..bc5ee645965 100644 --- a/qa/qa/support/page/logging.rb +++ b/qa/qa/support/page/logging.rb @@ -82,6 +82,12 @@ module QA super end + def click_via_capybara(method, locator) + log("clicking via capybara using '#{method}(#{locator})'") + + super + end + def fill_element(name, content) masked_content = name.to_s.match?(/token|key|password/) ? '*****' : content diff --git a/spec/graphql/mutations/base_mutation_spec.rb b/spec/graphql/mutations/base_mutation_spec.rb index 7939fadb37b..6b366b0c234 100644 --- a/spec/graphql/mutations/base_mutation_spec.rb +++ b/spec/graphql/mutations/base_mutation_spec.rb @@ -15,6 +15,7 @@ RSpec.describe ::Mutations::BaseMutation do context 'when argument is nullable and required' do let(:mutation_class) do Class.new(described_class) do + graphql_name 'BaseMutation' argument :foo, GraphQL::Types::String, required: :nullable end end @@ -35,6 +36,7 @@ RSpec.describe ::Mutations::BaseMutation do context 'when argument is required and NOT nullable' do let(:mutation_class) do Class.new(described_class) do + graphql_name 'BaseMutation' argument :foo, GraphQL::Types::String, required: true end end diff --git a/spec/graphql/mutations/concerns/mutations/finds_by_gid_spec.rb b/spec/graphql/mutations/concerns/mutations/finds_by_gid_spec.rb index 37e0fd611e4..451f6d1fe06 100644 --- a/spec/graphql/mutations/concerns/mutations/finds_by_gid_spec.rb +++ b/spec/graphql/mutations/concerns/mutations/finds_by_gid_spec.rb @@ -13,7 +13,7 @@ RSpec.describe Mutations::FindsByGid do end end - let(:query) { double('Query', schema: GitlabSchema) } + let(:query) { query_double(schema: GitlabSchema) } let(:context) { GraphQL::Query::Context.new(query: query, object: nil, values: { current_user: user }) } let(:user) { create(:user) } let(:gid) { user.to_global_id } diff --git a/spec/graphql/mutations/merge_requests/accept_spec.rb b/spec/graphql/mutations/merge_requests/accept_spec.rb index c97c78ec206..c99b1d988c5 100644 --- a/spec/graphql/mutations/merge_requests/accept_spec.rb +++ b/spec/graphql/mutations/merge_requests/accept_spec.rb @@ -3,6 +3,7 @@ require 'spec_helper' RSpec.describe Mutations::MergeRequests::Accept do + include GraphqlHelpers include AfterNextHelpers subject(:mutation) { described_class.new(context: context, object: nil, field: nil) } @@ -12,7 +13,7 @@ RSpec.describe Mutations::MergeRequests::Accept do let(:project) { create(:project, :public, :repository) } let(:context) do GraphQL::Query::Context.new( - query: double('query', schema: GitlabSchema), + query: query_double(schema: GitlabSchema), values: { current_user: user }, object: nil ) diff --git a/spec/graphql/mutations/merge_requests/create_spec.rb b/spec/graphql/mutations/merge_requests/create_spec.rb index 83af1e3f1b3..e1edb60e4ff 100644 --- a/spec/graphql/mutations/merge_requests/create_spec.rb +++ b/spec/graphql/mutations/merge_requests/create_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe Mutations::MergeRequests::Create do + include GraphqlHelpers + subject(:mutation) { described_class.new(object: nil, context: context, field: nil) } let_it_be(:project) { create(:project, :public, :repository) } @@ -10,7 +12,7 @@ RSpec.describe Mutations::MergeRequests::Create do let(:context) do GraphQL::Query::Context.new( - query: double('query', schema: nil), + query: query_double(schema: nil), values: { current_user: user }, object: nil ) diff --git a/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb index 86e7d4e344c..b6c3cb4e04a 100644 --- a/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb +++ b/spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb @@ -3,13 +3,15 @@ require 'spec_helper' RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do + include GraphqlHelpers + # https://gitlab.com/gitlab-org/gitlab/-/issues/334973 # The spec will be merged with connection_spec.rb in the future. let(:nodes) { Project.all.order(id: :asc) } let(:arguments) { {} } let(:query_type) { GraphQL::ObjectType.new } let(:schema) { GraphQL::Schema.define(query: query_type, mutation: nil)} - let(:context) { GraphQL::Query::Context.new(query: double('query', schema: schema), values: nil, object: nil) } + let(:context) { GraphQL::Query::Context.new(query: query_double(schema: schema), values: nil, object: nil) } let_it_be(:column_order_id) { Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(attribute_name: 'id', order_expression: Project.arel_table[:id].asc) } let_it_be(:column_order_id_desc) { Gitlab::Pagination::Keyset::ColumnOrderDefinition.new(attribute_name: 'id', order_expression: Project.arel_table[:id].desc) } diff --git a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb index f31ec6c09fd..a4ba288b7f1 100644 --- a/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb +++ b/spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb @@ -3,11 +3,13 @@ require 'spec_helper' RSpec.describe Gitlab::Graphql::Pagination::Keyset::Connection do + include GraphqlHelpers + let(:nodes) { Project.all.order(id: :asc) } let(:arguments) { {} } let(:query_type) { GraphQL::ObjectType.new } let(:schema) { GraphQL::Schema.define(query: query_type, mutation: nil)} - let(:context) { GraphQL::Query::Context.new(query: double('query', schema: schema), values: nil, object: nil) } + let(:context) { GraphQL::Query::Context.new(query: query_double(schema: schema), values: nil, object: nil) } subject(:connection) do described_class.new(nodes, **{ context: context, max_page_size: 3 }.merge(arguments)) diff --git a/spec/support/helpers/graphql_helpers.rb b/spec/support/helpers/graphql_helpers.rb index ff8908e531a..3b6a71c03a4 100644 --- a/spec/support/helpers/graphql_helpers.rb +++ b/spec/support/helpers/graphql_helpers.rb @@ -346,6 +346,10 @@ module GraphqlHelpers end end + def query_double(schema:) + double('query', schema: schema) + end + def wrap_fields(fields) fields = Array.wrap(fields).map do |field| case field