summaryrefslogtreecommitdiff
path: root/qa/qa/page/merge_request/show.rb
diff options
context:
space:
mode:
Diffstat (limited to 'qa/qa/page/merge_request/show.rb')
-rw-r--r--qa/qa/page/merge_request/show.rb43
1 files changed, 36 insertions, 7 deletions
diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb
index f8d063ac6bd..d76dfb295a0 100644
--- a/qa/qa/page/merge_request/show.rb
+++ b/qa/qa/page/merge_request/show.rb
@@ -83,10 +83,18 @@ module QA
element :merge_immediately_menu_item
end
+ view 'app/assets/javascripts/vue_merge_request_widget/components/states/sha_mismatch.vue' do
+ element :head_mismatch_content
+ end
+
view 'app/assets/javascripts/vue_merge_request_widget/components/states/squash_before_merge.vue' do
element :squash_checkbox
end
+ view 'app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue' do
+ element :mr_widget_content
+ end
+
view 'app/assets/javascripts/vue_shared/components/markdown/apply_suggestion.vue' do
element :apply_suggestion_dropdown
element :commit_message_field
@@ -255,7 +263,8 @@ module QA
# status as unmerged, the test will fail.
# Revisit after merge page re-architect is done https://gitlab.com/groups/gitlab-org/-/epics/5598
# To remove page refresh logic if possible
- retry_until(max_attempts: 3, reload: true) do
+ # We don't raise on failure because this method is used as a predicate matcher
+ retry_until(max_attempts: 3, reload: true, raise_on_failure: false) do
has_element?(:merged_status_content, text: 'The changes were merged into', wait: 20)
end
end
@@ -269,13 +278,29 @@ module QA
has_element?(:merge_button, disabled: false)
end
- # Waits up 60 seconds and raises an error if unable to merge
- def wait_until_ready_to_merge
- has_element?(:merge_button)
+ # Waits up 60 seconds and raises an error if unable to merge.
+ #
+ # If a state is encountered in which a user would typically refresh the page, this will refresh the page and
+ # then check again if it's ready to merge. For example, it will refresh if a new change was pushed and the page
+ # needs to be refreshed to show the change.
+ #
+ # @param [Boolean] transient_test true if the current test is a transient test (default: false)
+ def wait_until_ready_to_merge(transient_test: false)
+ wait_until do
+ has_element?(:merge_button)
- # The merge button is enabled via JS
- wait_until(reload: false) do
- !find_element(:merge_button).disabled?
+ break true unless find_element(:merge_button).disabled?
+
+ # If the widget shows "Merge blocked: new changes were just added" we can refresh the page and check again
+ next false if has_element?(:head_mismatch_content)
+
+ # Stop waiting if we're in a transient test. By this point we're in an unexpected state and should let the
+ # test fail so we can investigate. If we're not in a transient test we keep trying until we reach timeout.
+ next true unless transient_test
+
+ QA::Runtime::Logger.debug("MR widget text: #{mr_widget_text}")
+
+ false
end
end
@@ -385,6 +410,10 @@ module QA
def cancel_auto_merge!
click_element(:cancel_auto_merge_button)
end
+
+ def mr_widget_text
+ find_element(:mr_widget_content).text
+ end
end
end
end