From f64a639bcfa1fc2bc89ca7db268f594306edfd7c Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 16 Mar 2021 18:18:33 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-10-stable-ee --- qa/qa/page/admin/settings/component/ip_limits.rb | 6 +- .../admin/settings/component/outbound_requests.rb | 2 +- .../admin/settings/component/performance_bar.rb | 2 +- .../settings/component/sign_up_restrictions.rb | 8 +-- qa/qa/page/base.rb | 23 +++++-- qa/qa/page/component/invite_members_modal.rb | 80 ++++++++++++++++++++++ qa/qa/page/component/issue_board/show.rb | 8 +++ qa/qa/page/component/new_snippet.rb | 6 +- qa/qa/page/component/note.rb | 3 +- qa/qa/page/component/wiki.rb | 74 ++++++++++++++++++++ qa/qa/page/component/wiki_page_form.rb | 52 ++++++++++++++ qa/qa/page/component/wiki_sidebar.rb | 48 +++++++++++++ qa/qa/page/dashboard/snippet/edit.rb | 6 +- qa/qa/page/group/members.rb | 29 +------- qa/qa/page/group/menu.rb | 13 ++++ qa/qa/page/group/settings/general.rb | 48 ++++++------- qa/qa/page/group/settings/package_registries.rb | 42 ++++++++++++ qa/qa/page/main/login.rb | 2 +- qa/qa/page/merge_request/show.rb | 72 ++++++++++++------- qa/qa/page/project/import/github.rb | 39 ++++++++--- qa/qa/page/project/issue/index.rb | 14 ++-- qa/qa/page/project/members.rb | 35 ++-------- qa/qa/page/project/new.rb | 2 +- .../project/operations/kubernetes/add_existing.rb | 2 +- qa/qa/page/project/operations/kubernetes/index.rb | 4 +- qa/qa/page/project/registry/show.rb | 40 +++++++++++ qa/qa/page/project/settings/auto_devops.rb | 4 +- qa/qa/page/project/settings/ci_variables.rb | 1 - qa/qa/page/project/settings/incidents.rb | 2 +- qa/qa/page/project/settings/main.rb | 13 ++-- qa/qa/page/project/settings/merge_request.rb | 10 +-- qa/qa/page/project/sub_menus/packages.rb | 19 +++++ qa/qa/page/project/sub_menus/settings.rb | 2 +- qa/qa/page/project/web_ide/edit.rb | 4 -- qa/qa/page/project/wiki/edit.rb | 40 +---------- qa/qa/page/project/wiki/show.rb | 64 +---------------- qa/qa/page/project/wiki/sidebar.rb | 50 -------------- 37 files changed, 554 insertions(+), 315 deletions(-) create mode 100644 qa/qa/page/component/invite_members_modal.rb create mode 100644 qa/qa/page/component/wiki.rb create mode 100644 qa/qa/page/component/wiki_page_form.rb create mode 100644 qa/qa/page/component/wiki_sidebar.rb create mode 100644 qa/qa/page/group/settings/package_registries.rb create mode 100644 qa/qa/page/project/registry/show.rb delete mode 100644 qa/qa/page/project/wiki/sidebar.rb (limited to 'qa/qa/page') diff --git a/qa/qa/page/admin/settings/component/ip_limits.rb b/qa/qa/page/admin/settings/component/ip_limits.rb index 9db2ae8ba58..1f9bd113cab 100644 --- a/qa/qa/page/admin/settings/component/ip_limits.rb +++ b/qa/qa/page/admin/settings/component/ip_limits.rb @@ -14,9 +14,9 @@ module QA end def enable_throttles - check_element :throttle_unauthenticated_checkbox - check_element :throttle_authenticated_api_checkbox - check_element :throttle_authenticated_web_checkbox + check_element(:throttle_unauthenticated_checkbox) + check_element(:throttle_authenticated_api_checkbox) + check_element(:throttle_authenticated_web_checkbox) end def save_settings diff --git a/qa/qa/page/admin/settings/component/outbound_requests.rb b/qa/qa/page/admin/settings/component/outbound_requests.rb index 248ea5b6715..c812c05f9c1 100644 --- a/qa/qa/page/admin/settings/component/outbound_requests.rb +++ b/qa/qa/page/admin/settings/component/outbound_requests.rb @@ -19,7 +19,7 @@ module QA private def check_allow_requests_to_local_network_from_services_checkbox - check_element :allow_requests_from_services_checkbox + check_element(:allow_requests_from_services_checkbox) end def click_save_changes_button diff --git a/qa/qa/page/admin/settings/component/performance_bar.rb b/qa/qa/page/admin/settings/component/performance_bar.rb index bc29efb64c0..9e92fa362fb 100644 --- a/qa/qa/page/admin/settings/component/performance_bar.rb +++ b/qa/qa/page/admin/settings/component/performance_bar.rb @@ -12,7 +12,7 @@ module QA end def enable_performance_bar - click_element :enable_performance_bar_checkbox + check_element(:enable_performance_bar_checkbox) Capybara.current_session.driver.browser.manage.add_cookie(name: 'perf_bar_enabled', value: 'true') end diff --git a/qa/qa/page/admin/settings/component/sign_up_restrictions.rb b/qa/qa/page/admin/settings/component/sign_up_restrictions.rb index 9526faf4126..9909155641f 100644 --- a/qa/qa/page/admin/settings/component/sign_up_restrictions.rb +++ b/qa/qa/page/admin/settings/component/sign_up_restrictions.rb @@ -13,13 +13,13 @@ module QA end def require_admin_approval_after_user_signup - check_element :require_admin_approval_after_user_signup_checkbox - click_element :save_changes_button + check_element(:require_admin_approval_after_user_signup_checkbox) + click_element(:save_changes_button) end def disable_signups - uncheck_element :signup_enabled_checkbox - click_element :save_changes_button + uncheck_element(:signup_enabled_checkbox) + click_element(:save_changes_button) end end end diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb index 99f73bbba48..d1b556b58fb 100644 --- a/qa/qa/page/base.rb +++ b/qa/qa/page/base.rb @@ -133,9 +133,15 @@ module QA end def check_element(name) + if find_element(name, visible: false).checked? + QA::Runtime::Logger.debug("#{name} is already checked") + + return + end + retry_until(sleep_interval: 1) do - find_element(name).set(true) - checked = find_element(name).checked? + find_element(name, visible: false).click + checked = find_element(name, visible: false).checked? QA::Runtime::Logger.debug(checked ? "#{name} was checked" : "#{name} was not checked") @@ -144,10 +150,19 @@ module QA end def uncheck_element(name) + unless find_element(name, visible: false).checked? + QA::Runtime::Logger.debug("#{name} is already unchecked") + + return + end + retry_until(sleep_interval: 1) do - find_element(name).set(false) + find_element(name, visible: false).click + unchecked = !find_element(name, visible: false).checked? + + QA::Runtime::Logger.debug(unchecked ? "#{name} was unchecked" : "#{name} was not unchecked") - !find_element(name).checked? + unchecked end end diff --git a/qa/qa/page/component/invite_members_modal.rb b/qa/qa/page/component/invite_members_modal.rb new file mode 100644 index 00000000000..fbddb37f15e --- /dev/null +++ b/qa/qa/page/component/invite_members_modal.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +module QA + module Page + module Component + module InviteMembersModal + extend QA::Page::PageConcern + + def self.included(base) + super + + base.view 'app/assets/javascripts/invite_members/components/invite_members_modal.vue' do + element :invite_button + element :access_level_dropdown + element :invite_members_modal_content + end + + base.view 'app/assets/javascripts/invite_members/components/group_select.vue' do + element :group_select_dropdown_search_field + end + + base.view 'app/assets/javascripts/invite_members/components/invite_group_trigger.vue' do + element :invite_a_group_button + end + + base.view 'app/assets/javascripts/invite_members/components/invite_members_trigger.vue' do + element :invite_members_button + end + end + + def open_invite_members_modal + click_element :invite_members_button + end + + def open_invite_group_modal + click_element :invite_a_group_button + end + + def add_member(username, access_level = Resource::Members::AccessLevel::DEVELOPER) + open_invite_members_modal + + within_element(:invite_members_modal_content) do + fill_element :access_level_dropdown, with: access_level + + fill_in 'Search for members to invite', with: username + + Support::WaitForRequests.wait_for_requests + + click_button username + + click_element :invite_button + end + + Support::WaitForRequests.wait_for_requests + + page.refresh + end + + def invite_group(group_name, group_access = Resource::Members::AccessLevel::GUEST) + open_invite_group_modal + + fill_element :access_level_dropdown, with: group_access + + click_button 'Select a group' + fill_element :group_select_dropdown_search_field, group_name + + Support::WaitForRequests.wait_for_requests + + click_button group_name + + click_element :invite_button + + Support::WaitForRequests.wait_for_requests + + page.refresh + end + end + end + end +end diff --git a/qa/qa/page/component/issue_board/show.rb b/qa/qa/page/component/issue_board/show.rb index 4c1f03fbe86..d7dfb0757bc 100644 --- a/qa/qa/page/component/issue_board/show.rb +++ b/qa/qa/page/component/issue_board/show.rb @@ -43,6 +43,10 @@ module QA element :focus_mode_button end + view 'app/assets/javascripts/boards/components/config_toggle.vue' do + element :boards_config_button + end + # The `focused_board` method does not use `find_element` with an element defined # with the attribute `data-qa-selector` since such element is not unique when the # `is-focused` class is not set, and it was not possible to find a better solution. @@ -82,6 +86,10 @@ module QA end end + def click_boards_config_button + click_element(:boards_config_button) + end + def click_boards_dropdown_button # The dropdown button comes from the `GlDropdown` component of `@gitlab/ui`, # so it wasn't possible to add a `data-qa-selector` to it. diff --git a/qa/qa/page/component/new_snippet.rb b/qa/qa/page/component/new_snippet.rb index 741a3feb73b..673bc7ba44c 100644 --- a/qa/qa/page/component/new_snippet.rb +++ b/qa/qa/page/component/new_snippet.rb @@ -32,6 +32,10 @@ module QA # This 'element' is here only to ensure the changes in the view source aren't mistakenly changed element :_, "qa_selector = local_assigns.fetch(:qa_selector, '')" # rubocop:disable QA/ElementWithPattern end + + base.view 'app/assets/javascripts/snippets/components/snippet_visibility_edit.vue' do + element :visibility_content + end end def fill_title(title) @@ -44,7 +48,7 @@ module QA end def set_visibility(visibility) - choose visibility + click_element(:visibility_content, visibility: visibility) end def fill_file_name(name, file_number = nil) diff --git a/qa/qa/page/component/note.rb b/qa/qa/page/component/note.rb index 50567796bdb..67583f71bf3 100644 --- a/qa/qa/page/component/note.rb +++ b/qa/qa/page/component/note.rb @@ -17,7 +17,6 @@ module QA element :comment_button element :comment_field element :discussion_menu_item - element :note_dropdown end base.view 'app/assets/javascripts/notes/components/discussion_actions.vue' do @@ -146,7 +145,7 @@ module QA def start_discussion(text) fill_element :comment_field, text - click_element :note_dropdown + within_element(:comment_button) { click_button(class: 'dropdown-toggle-split') } click_element :discussion_menu_item click_element :comment_button diff --git a/qa/qa/page/component/wiki.rb b/qa/qa/page/component/wiki.rb new file mode 100644 index 00000000000..92eb25af247 --- /dev/null +++ b/qa/qa/page/component/wiki.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +module QA + module Page + module Component + module Wiki + extend QA::Page::PageConcern + + def self.included(base) + super + + base.view 'app/views/shared/wikis/show.html.haml' do + element :wiki_page_title + element :wiki_page_content + element :edit_page_button + end + + base.view 'app/views/shared/wikis/_main_links.html.haml' do + element :new_page_button + element :page_history_button + end + + base.view 'app/views/shared/empty_states/_wikis.html.haml' do + element :create_first_page_link + end + + base.view 'app/views/shared/empty_states/_wikis_layout.html.haml' do + element :svg_content + end + end + + def click_create_your_first_page + # The svg takes a fraction of a second to load after which the + # "Create your first page" button shifts up a bit. This can cause + # webdriver to miss the hit so we wait for the svg to load before + # clicking the button. + within_element(:svg_content) do + has_element?(:js_lazy_loaded) + end + + click_element(:create_first_page_link) + end + + def click_new_page + click_element(:new_page_button) + end + + def click_page_history + click_element(:page_history_button) + end + + def click_edit + click_element(:edit_page_button) + end + + def has_title?(title) + has_element?(:wiki_page_title, title) + end + + def has_content?(content) + has_element?(:wiki_page_content, content) + end + + def has_no_content?(content) + has_no_element?(:wiki_page_content, content) + end + + def has_no_page? + has_element?(:create_first_page_link) + end + end + end + end +end diff --git a/qa/qa/page/component/wiki_page_form.rb b/qa/qa/page/component/wiki_page_form.rb new file mode 100644 index 00000000000..e24b1b67af1 --- /dev/null +++ b/qa/qa/page/component/wiki_page_form.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +module QA + module Page + module Component + module WikiPageForm + extend QA::Page::PageConcern + + def self.included(base) + super + + base.view 'app/views/shared/wikis/_form.html.haml' do + element :wiki_title_textbox + element :wiki_content_textarea + element :wiki_message_textbox + element :save_changes_button + element :create_page_button + end + + base.view 'app/assets/javascripts/pages/shared/wikis/components/delete_wiki_modal.vue' do + element :delete_button + end + end + + def set_title(title) + fill_element(:wiki_title_textbox, title) + end + + def set_content(content) + fill_element(:wiki_content_textarea, content) + end + + def set_message(message) + fill_element(:wiki_message_textbox, message) + end + + def click_save_changes + click_element(:save_changes_button) + end + + def click_create_page + click_element(:create_page_button) + end + + def delete_page + click_element(:delete_button, Page::Modal::DeleteWiki) + Page::Modal::DeleteWiki.perform(&:confirm_deletion) + end + end + end + end +end diff --git a/qa/qa/page/component/wiki_sidebar.rb b/qa/qa/page/component/wiki_sidebar.rb new file mode 100644 index 00000000000..dfb912a1d0b --- /dev/null +++ b/qa/qa/page/component/wiki_sidebar.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module QA + module Page + module Component + module WikiSidebar + extend QA::Page::PageConcern + + def self.included(base) + super + + base.view 'app/views/shared/wikis/_sidebar.html.haml' do + element :clone_repository_link + element :view_all_pages_button + end + + base.view 'app/views/shared/wikis/_sidebar_wiki_page.html.haml' do + element :wiki_page_link + end + + base.view 'app/views/shared/wikis/_wiki_directory.html.haml' do + element :wiki_directory_content + end + end + + def click_clone_repository + click_element(:clone_repository_link) + end + + def click_view_all_pages + click_element(:view_all_pages_button) + end + + def click_page_link(page_title) + click_element(:wiki_page_link, page_name: page_title) + end + + def has_page_listed?(page_title) + has_element?(:wiki_page_link, page_name: page_title) + end + + def has_directory?(directory) + has_element?(:wiki_directory_content, text: directory) + end + end + end + end +end diff --git a/qa/qa/page/dashboard/snippet/edit.rb b/qa/qa/page/dashboard/snippet/edit.rb index 40add146e97..cd8ac77ae04 100644 --- a/qa/qa/page/dashboard/snippet/edit.rb +++ b/qa/qa/page/dashboard/snippet/edit.rb @@ -18,13 +18,17 @@ module QA element :delete_file_button end + view 'app/assets/javascripts/snippets/components/snippet_visibility_edit.vue' do + element :visibility_content + end + def add_to_file_content(content) text_area.set content text_area.has_text?(content) # wait for changes to take effect end def change_visibility_to(visibility_type) - choose(visibility_type) + click_element(:visibility_content, visibility: visibility_type) end def click_add_file diff --git a/qa/qa/page/group/members.rb b/qa/qa/page/group/members.rb index 87423ae9d75..68a169d5a7f 100644 --- a/qa/qa/page/group/members.rb +++ b/qa/qa/page/group/members.rb @@ -4,18 +4,13 @@ module QA module Page module Group class Members < Page::Base - include QA::Page::Component::Select2 + include Page::Component::InviteMembersModal include Page::Component::UsersSelect view 'app/assets/javascripts/vue_shared/components/remove_member_modal.vue' do element :remove_member_modal_content end - view 'app/views/shared/members/_invite_member.html.haml' do - element :member_select_field - element :invite_member_button - end - view 'app/assets/javascripts/pages/groups/group_members/index.js' do element :member_row element :groups_list @@ -32,31 +27,9 @@ module QA end view 'app/views/groups/group_members/index.html.haml' do - element :invite_group_tab element :groups_list_tab end - view 'app/views/shared/members/_invite_group.html.haml' do - element :group_select_field - element :invite_group_button - end - - def select_group(group_name) - click_element :group_select_field - search_and_select(group_name) - end - - def invite_group(group_name) - click_element :invite_group_tab - select_group(group_name) - click_element :invite_group_button - end - - def add_member(username) - select_user :member_select_field, username - click_element :invite_member_button - end - def update_access_level(username, access_level) within_element(:member_row, text: username) do click_element :access_level_dropdown diff --git a/qa/qa/page/group/menu.rb b/qa/qa/page/group/menu.rb index 7689dd7e5c8..10c0ee1f0a9 100644 --- a/qa/qa/page/group/menu.rb +++ b/qa/qa/page/group/menu.rb @@ -14,6 +14,10 @@ module QA element :group_settings_item end + view 'app/views/groups/sidebar/_packages_settings.html.haml' do + element :group_package_settings_link + end + view 'app/views/layouts/nav/sidebar/_analytics_links.html.haml' do element :analytics_link element :analytics_sidebar_submenu @@ -55,6 +59,15 @@ module QA end end + def go_to_package_settings + scroll_to_element(:group_settings_item) + hover_element(:group_settings_item) do + within_submenu(:group_sidebar_submenu) do + click_element(:group_package_settings_link) + end + end + end + private def hover_issues diff --git a/qa/qa/page/group/settings/general.rb b/qa/qa/page/group/settings/general.rb index 8f5267c3362..ced8bd5c812 100644 --- a/qa/qa/page/group/settings/general.rb +++ b/qa/qa/page/group/settings/general.rb @@ -54,57 +54,57 @@ module QA end def set_lfs_enabled - expand_content :permission_lfs_2fa_content - check_element :lfs_checkbox - click_element :save_permissions_changes_button + expand_content(:permission_lfs_2fa_content) + check_element(:lfs_checkbox) + click_element(:save_permissions_changes_button) end def set_lfs_disabled - expand_content :permission_lfs_2fa_content - uncheck_element :lfs_checkbox - click_element :save_permissions_changes_button + expand_content(:permission_lfs_2fa_content) + uncheck_element(:lfs_checkbox) + click_element(:save_permissions_changes_button) end def set_request_access_enabled - expand_content :permission_lfs_2fa_content - check_element :request_access_checkbox - click_element :save_permissions_changes_button + expand_content(:permission_lfs_2fa_content) + check_element(:request_access_checkbox) + click_element(:save_permissions_changes_button) end def set_request_access_disabled - expand_content :permission_lfs_2fa_content - uncheck_element :request_access_checkbox - click_element :save_permissions_changes_button + expand_content(:permission_lfs_2fa_content) + uncheck_element(:request_access_checkbox) + click_element(:save_permissions_changes_button) end def set_require_2fa_enabled - expand_content :permission_lfs_2fa_content - check_element :require_2fa_checkbox - click_element :save_permissions_changes_button + expand_content(:permission_lfs_2fa_content) + check_element(:require_2fa_checkbox) + click_element(:save_permissions_changes_button) end def set_require_2fa_disabled - expand_content :permission_lfs_2fa_content - uncheck_element :require_2fa_checkbox - click_element :save_permissions_changes_button + expand_content(:permission_lfs_2fa_content) + uncheck_element(:require_2fa_checkbox) + click_element(:save_permissions_changes_button) end def set_project_creation_level(value) - expand_content :permission_lfs_2fa_content + expand_content(:permission_lfs_2fa_content) select_element(:project_creation_level_dropdown, value) - click_element :save_permissions_changes_button + click_element(:save_permissions_changes_button) end def toggle_request_access - expand_content :permission_lfs_2fa_content + expand_content(:permission_lfs_2fa_content) if find_element(:request_access_checkbox).checked? - uncheck_element :request_access_checkbox + uncheck_element(:request_access_checkbox) else - check_element :request_access_checkbox + check_element(:request_access_checkbox) end - click_element :save_permissions_changes_button + click_element(:save_permissions_changes_button) end end end diff --git a/qa/qa/page/group/settings/package_registries.rb b/qa/qa/page/group/settings/package_registries.rb new file mode 100644 index 00000000000..ee5ca849a47 --- /dev/null +++ b/qa/qa/page/group/settings/package_registries.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module QA + module Page + module Group + module Settings + class PackageRegistries < QA::Page::Base + include ::QA::Page::Settings::Common + + view 'app/assets/javascripts/packages_and_registries/settings/group/components/group_settings_app.vue' do + element :package_registry_settings_content + end + + view 'app/assets/javascripts/packages_and_registries/settings/group/components/maven_settings.vue' do + element :allow_duplicates_toggle + element :allow_duplicates_label + end + + def set_allow_duplicates_disabled + expand_content :package_registry_settings_content do + click_element(:allow_duplicates_toggle) if duplicates_enabled? + end + end + + def set_allow_duplicates_enabled + expand_content :package_registry_settings_content do + click_element(:allow_duplicates_toggle) if duplicates_disabled? + end + end + + def duplicates_enabled? + has_element?(:allow_duplicates_label, text: 'Allow duplicates') + end + + def duplicates_disabled? + has_element?(:allow_duplicates_label, text: 'Do not allow duplicates') + end + end + end + end + end +end diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb index 265e2b7573c..048119d65cb 100644 --- a/qa/qa/page/main/login.rb +++ b/qa/qa/page/main/login.rb @@ -52,7 +52,7 @@ module QA using_wait_time 0 do set_initial_password_if_present - raise NotImplementedError if Runtime::User.ldap_user? && user&.credentials_given? + raise 'If an LDAP user is provided, it must be used for sign-in', QA::Resource::User::InvalidUserError if Runtime::User.ldap_user? && user && user.username != Runtime::User.ldap_username if Runtime::User.ldap_user? sign_in_using_ldap_credentials(user: user || Runtime::User) diff --git a/qa/qa/page/merge_request/show.rb b/qa/qa/page/merge_request/show.rb index 18676807fd6..0b6a3085a3a 100644 --- a/qa/qa/page/merge_request/show.rb +++ b/qa/qa/page/merge_request/show.rb @@ -9,8 +9,8 @@ module QA view 'app/assets/javascripts/vue_merge_request_widget/components/mr_widget_header.vue' do element :download_dropdown - element :download_email_patches - element :download_plain_diff + element :download_email_patches_menu_item + element :download_plain_diff_menu_item element :open_in_web_ide_button end @@ -21,9 +21,13 @@ module QA view 'app/assets/javascripts/vue_merge_request_widget/components/states/ready_to_merge.vue' do element :merge_button - element :fast_forward_message, 'Fast-forward merge without a merge commit' # rubocop:disable QA/ElementWithPattern + element :fast_forward_message_content element :merge_moment_dropdown - element :merge_immediately_option + element :merge_immediately_menu_item + end + + view 'app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue' do + element :merge_request_status_content end view 'app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_merged.vue' do @@ -36,7 +40,7 @@ module QA view 'app/assets/javascripts/vue_merge_request_widget/components/states/mr_widget_rebase.vue' do element :mr_rebase_button - element :no_fast_forward_message, 'Fast-forward merge is not possible' # rubocop:disable QA/ElementWithPattern + element :no_fast_forward_message_content end view 'app/assets/javascripts/vue_merge_request_widget/components/states/squash_before_merge.vue' do @@ -64,7 +68,8 @@ module QA end view 'app/assets/javascripts/diffs/components/inline_diff_table_row.vue' do - element :new_diff_line + element :diff_comment_button + element :new_diff_line_link end view 'app/views/projects/merge_requests/_mr_title.html.haml' do @@ -72,11 +77,11 @@ module QA end view 'app/assets/javascripts/batch_comments/components/publish_button.vue' do - element :submit_review + element :submit_review_button end view 'app/assets/javascripts/batch_comments/components/review_bar.vue' do - element :review_bar + element :review_bar_content end view 'app/assets/javascripts/notes/components/note_form.vue' do @@ -124,18 +129,18 @@ module QA end def submit_pending_reviews - within_element(:review_bar) do + within_element(:review_bar_content) do click_element(:review_preview_toggle) - click_element(:submit_review) + click_element(:submit_review_button) # After clicking the button, wait for it to disappear # before moving on to the next part of the test - has_no_element?(:submit_review) + has_no_element?(:submit_review_button) end end def discard_pending_reviews - within_element(:review_bar) do + within_element(:review_bar_content) do click_element(:discard_review) end click_element(:modal_delete_pending_comments) @@ -154,8 +159,8 @@ module QA wait_until(sleep_interval: 5) do has_css?('a[data-linenumber="1"]') end - all_elements(:new_diff_line, minimum: 1).first.hover - click_element(:diff_comment) + all_elements(:new_diff_line_link, minimum: 1).first.hover + click_element(:diff_comment_button) fill_element(:reply_field, text) end @@ -179,7 +184,11 @@ module QA end def fast_forward_possible? - has_no_text?('Fast-forward merge is not possible') + has_element?(:fast_forward_message_content) + end + + def fast_forward_not_possible? + has_element?(:no_fast_forward_message_content) end def has_file?(file_name) @@ -220,12 +229,12 @@ module QA !find_element(:squash_checkbox).disabled? end + # TODO: Fix workaround for data-qa-selector failure click_element(:squash_checkbox) end def merge! - wait_until_ready_to_merge - click_element(:merge_button) + try_to_merge! finished_loading? raise "Merge did not appear to be successful" unless merged? @@ -233,11 +242,21 @@ module QA def merge_immediately! click_element(:merge_moment_dropdown) - click_element(:merge_immediately_option) + click_element(:merge_immediately_menu_item) + end + + def merge_when_pipeline_succeeds! + wait_until_ready_to_merge + + click_element(:merge_button, text: 'Merge when pipeline succeeds') end def merged? - has_element?(:merged_status_content, text: 'The changes were merged into', wait: 60) + # Revisit after merge page re-architect is done https://gitlab.com/gitlab-org/gitlab/-/issues/300042 + # To remove page refresh logic if possible + retry_until(max_attempts: 3, reload: true) do + has_element?(:merged_status_content, text: 'The changes were merged into', wait: 20) + end end # Check if the MR is able to be merged @@ -249,6 +268,10 @@ module QA has_element?(:merge_button, disabled: false) end + def merge_request_status + find_element(:merge_request_status_content).text + end + # Waits up 60 seconds and raises an error if unable to merge def wait_until_ready_to_merge has_element?(:merge_button) @@ -273,26 +296,29 @@ module QA click_element(:mr_rebase_button) success = wait_until do - has_text?('Fast-forward merge without a merge commit') + fast_forward_possible? end raise "Rebase did not appear to be successful" unless success end def try_to_merge! + # Revisit after merge page re-architect is done https://gitlab.com/gitlab-org/gitlab/-/issues/300042 + # To remove page refresh logic if possible wait_until_ready_to_merge + wait_until { !find_element(:merge_button).has_text?("when pipeline succeeds") } click_element(:merge_button) end def view_email_patches click_element(:download_dropdown) - visit_link_in_element(:download_email_patches) + visit_link_in_element(:download_email_patches_menu_item) end def view_plain_diff click_element(:download_dropdown) - visit_link_in_element(:download_plain_diff) + visit_link_in_element(:download_plain_diff_menu_item) end def wait_for_merge_request_error_message @@ -315,7 +341,7 @@ module QA def add_suggestion_to_diff(suggestion, line) find("a[data-linenumber='#{line}']").hover - click_element(:diff_comment) + click_element(:diff_comment_button) click_element(:suggestion_button) initial_content = find_element(:reply_field).value fill_element(:reply_field, '') diff --git a/qa/qa/page/project/import/github.rb b/qa/qa/page/project/import/github.rb index 6890c7de9f8..58c82fa14c1 100644 --- a/qa/qa/page/project/import/github.rb +++ b/qa/qa/page/project/import/github.rb @@ -17,28 +17,34 @@ module QA element :project_namespace_select element :project_path_field element :import_button + element :project_path_content + element :go_to_project_button end def add_personal_access_token(personal_access_token) + # If for some reasons this process is retried, user cannot re-enter github token in the same group + # In this case skip this step and proceed to import project row + return unless has_element?(:personal_access_token_field) + fill_element(:personal_access_token_field, personal_access_token) click_element(:authenticate_button) finished_loading? end def import!(full_path, name) - choose_test_namespace(full_path) - set_path(full_path, name) - import_project(full_path) - wait_for_success + unless already_imported(full_path) + choose_test_namespace(full_path) + set_path(full_path, name) + import_project(full_path) + wait_for_success + end + + go_to_project(name) end private def within_repo_path(full_path) - wait_until(reload: false) do - has_element?(:project_import_row, text: full_path) - end - project_import_row = find_element(:project_import_row, text: full_path) within(project_import_row) do @@ -68,9 +74,22 @@ module QA def wait_for_success # TODO: set reload:false and remove skip_finished_loading_check_on_refresh when - # https://gitlab.com/gitlab-org/gitlab/-/issues/231542 is fixed + # https://gitlab.com/gitlab-org/gitlab/-/issues/292861 is fixed wait_until(max_duration: 60, sleep_interval: 5.0, reload: true, skip_finished_loading_check_on_refresh: true) do - page.has_content?('Done', wait: 1.0) + page.has_no_content?('Importing 1 repository', wait: 3.0) + end + end + + def go_to_project(name) + Page::Main::Menu.perform(&:go_to_projects) + Page::Dashboard::Projects.perform do |dashboard| + dashboard.go_to_project(name) + end + end + + def already_imported(full_path) + within_repo_path(full_path) do + has_element?(:project_path_content) && has_element?(:go_to_project_button) end end end diff --git a/qa/qa/page/project/issue/index.rb b/qa/qa/page/project/issue/index.rb index e85d10e4eb8..10ddd52719a 100644 --- a/qa/qa/page/project/issue/index.rb +++ b/qa/qa/page/project/issue/index.rb @@ -15,18 +15,14 @@ module QA element :avatar_counter_content end - view 'app/views/shared/issuable/csv_export/_button.html.haml' do - element :export_as_csv_button - end - - view 'app/views/shared/issuable/csv_export/_modal.html.haml' do - element :export_issues_button + view 'app/assets/javascripts/issuable/components/csv_export_modal.vue' do element :export_issuable_modal end - view 'app/views/projects/issues/import_csv/_button.html.haml' do - element :import_issues_button + view 'app/assets/javascripts/issuable/components/csv_import_export_buttons.vue' do + element :export_as_csv_button element :import_from_jira_link + element :import_issues_dropdown end view 'app/views/shared/issuable/_nav.html.haml' do @@ -60,7 +56,7 @@ module QA def click_import_issues_dropdown # When there are no issues, the image that loads causes the buttons to jump has_loaded_all_images? - click_element(:import_issues_button) + click_element(:import_issues_dropdown) end def export_issues_modal diff --git a/qa/qa/page/project/members.rb b/qa/qa/page/project/members.rb index 7e722e02ad0..09264d95aed 100644 --- a/qa/qa/page/project/members.rb +++ b/qa/qa/page/project/members.rb @@ -4,21 +4,18 @@ module QA module Page module Project class Members < Page::Base - include QA::Page::Component::Select2 - - view 'app/views/shared/members/_invite_member.html.haml' do - element :member_select_field - element :invite_member_button - end + include QA::Page::Component::InviteMembersModal view 'app/views/projects/project_members/index.html.haml' do - element :invite_group_tab element :groups_list_tab end - view 'app/views/shared/members/_invite_group.html.haml' do - element :group_select_field - element :invite_group_button + view 'app/assets/javascripts/invite_members/components/invite_group_trigger.vue' do + element :invite_a_group_button + end + + view 'app/assets/javascripts/invite_members/components/invite_members_trigger.vue' do + element :invite_members_button end view 'app/assets/javascripts/pages/projects/project_members/index.js' do @@ -33,25 +30,7 @@ module QA element :remove_group_link_modal_content end - def select_group(group_name) - click_element :group_select_field - search_and_select(group_name) - end - - def invite_group(group_name) - click_element :invite_group_tab - select_group(group_name) - click_element :invite_group_button - end - - def add_member(username) - click_element :member_select_field - search_and_select username - click_element :invite_member_button - end - def remove_group(group_name) - click_element :invite_group_tab click_element :groups_list_tab within_element(:group_row, text: group_name) do diff --git a/qa/qa/page/project/new.rb b/qa/qa/page/project/new.rb index 7e296528795..d1033dbfca9 100644 --- a/qa/qa/page/project/new.rb +++ b/qa/qa/page/project/new.rb @@ -68,7 +68,7 @@ module QA end def enable_initialize_with_readme - check_element :initialize_with_readme_checkbox + check_element(:initialize_with_readme_checkbox) end end end diff --git a/qa/qa/page/project/operations/kubernetes/add_existing.rb b/qa/qa/page/project/operations/kubernetes/add_existing.rb index 1b9a451c47d..59f59ca9966 100644 --- a/qa/qa/page/project/operations/kubernetes/add_existing.rb +++ b/qa/qa/page/project/operations/kubernetes/add_existing.rb @@ -36,7 +36,7 @@ module QA end def uncheck_rbac! - uncheck_element :rbac_checkbox + uncheck_element(:rbac_checkbox) end end end diff --git a/qa/qa/page/project/operations/kubernetes/index.rb b/qa/qa/page/project/operations/kubernetes/index.rb index 114e3ddd46a..ca41dddaca2 100644 --- a/qa/qa/page/project/operations/kubernetes/index.rb +++ b/qa/qa/page/project/operations/kubernetes/index.rb @@ -7,11 +7,11 @@ module QA module Kubernetes class Index < Page::Base view 'app/views/clusters/clusters/_empty_state.html.haml' do - element :add_kubernetes_cluster_button, "link_to s_('ClusterIntegration|Integrate with a cluster certificate')" # rubocop:disable QA/ElementWithPattern + element :add_kubernetes_cluster_link end def add_kubernetes_cluster - click_on 'Connect cluster with certificate' + click_element :add_kubernetes_cluster_link end def has_cluster?(cluster) diff --git a/qa/qa/page/project/registry/show.rb b/qa/qa/page/project/registry/show.rb new file mode 100644 index 00000000000..dffdb9eebba --- /dev/null +++ b/qa/qa/page/project/registry/show.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module QA + module Page + module Project + module Registry + class Show < QA::Page::Base + view 'app/assets/javascripts/registry/explorer/components/list_page/image_list_row.vue' do + element :registry_image_content + end + + view 'app/assets/javascripts/registry/explorer/components/details_page/tags_list_row.vue' do + element :tag_delete_button + end + + def has_registry_repository?(name) + find_element(:registry_image_content, text: name) + end + + def click_on_image(name) + click_element(:registry_image_content, text: name) + end + + def has_tag?(tag_name) + has_button?(tag_name) + end + + def has_no_tag?(tag_name) + has_no_button?(tag_name) + end + + def click_delete + click_element(:tag_delete_button) + find_button('Confirm').click + end + end + end + end + end +end diff --git a/qa/qa/page/project/settings/auto_devops.rb b/qa/qa/page/project/settings/auto_devops.rb index 827d5b072c3..9dffa010805 100644 --- a/qa/qa/page/project/settings/auto_devops.rb +++ b/qa/qa/page/project/settings/auto_devops.rb @@ -11,8 +11,8 @@ module QA end def enable_autodevops - check_element :enable_autodevops_checkbox - click_element :save_changes_button + check_element(:enable_autodevops_checkbox) + click_element(:save_changes_button) end end end diff --git a/qa/qa/page/project/settings/ci_variables.rb b/qa/qa/page/project/settings/ci_variables.rb index f2ced668a60..2b8fad64afb 100644 --- a/qa/qa/page/project/settings/ci_variables.rb +++ b/qa/qa/page/project/settings/ci_variables.rb @@ -10,7 +10,6 @@ module QA view 'app/assets/javascripts/ci_variable_list/components/ci_variable_modal.vue' do element :ci_variable_key_field element :ci_variable_value_field - element :ci_variable_masked_checkbox element :ci_variable_save_button element :ci_variable_delete_button end diff --git a/qa/qa/page/project/settings/incidents.rb b/qa/qa/page/project/settings/incidents.rb index 9b523e2aa9e..610129851d9 100644 --- a/qa/qa/page/project/settings/incidents.rb +++ b/qa/qa/page/project/settings/incidents.rb @@ -13,7 +13,7 @@ module QA end def enable_issues_for_incidents - check_element :create_issue_checkbox + check_element(:create_issue_checkbox) end def select_issue_template(template) diff --git a/qa/qa/page/project/settings/main.rb b/qa/qa/page/project/settings/main.rb index 4db66543a25..48af635bb79 100644 --- a/qa/qa/page/project/settings/main.rb +++ b/qa/qa/page/project/settings/main.rb @@ -11,8 +11,9 @@ module QA include Component::Breadcrumbs view 'app/views/projects/edit.html.haml' do - element :advanced_settings - element :merge_request_settings + element :advanced_settings_content + element :merge_request_settings_content + element :visibility_features_permissions_content end view 'app/views/projects/settings/_general.html.haml' do @@ -20,10 +21,6 @@ module QA element :save_naming_topics_avatar_button end - view 'app/views/projects/edit.html.haml' do - element :visibility_features_permissions_content - end - def rename_project_to(name) fill_project_name(name) click_save_changes @@ -38,13 +35,13 @@ module QA end def expand_advanced_settings(&block) - expand_content(:advanced_settings) do + expand_content(:advanced_settings_content) do Advanced.perform(&block) end end def expand_merge_requests_settings(&block) - expand_content(:merge_request_settings) do + expand_content(:merge_request_settings_content) do MergeRequest.perform(&block) end end diff --git a/qa/qa/page/project/settings/merge_request.rb b/qa/qa/page/project/settings/merge_request.rb index ec8d73df1b3..fe5d629effe 100644 --- a/qa/qa/page/project/settings/merge_request.rb +++ b/qa/qa/page/project/settings/merge_request.rb @@ -8,11 +8,11 @@ module QA include QA::Page::Settings::Common view 'app/views/projects/edit.html.haml' do - element :save_merge_request_changes + element :save_merge_request_changes_button end view 'app/views/projects/_merge_request_merge_method_settings.html.haml' do - element :radio_button_merge_ff + element :merge_ff_radio_button end view 'app/views/projects/_merge_request_merge_checks_settings.html.haml' do @@ -20,16 +20,16 @@ module QA end def click_save_changes - click_element :save_merge_request_changes + click_element :save_merge_request_changes_button end def enable_ff_only - click_element :radio_button_merge_ff + click_element :merge_ff_radio_button click_save_changes end def enable_merge_if_all_disscussions_are_resolved - click_element :allow_merge_if_all_discussions_are_resolved_checkbox + check_element(:allow_merge_if_all_discussions_are_resolved_checkbox) click_save_changes end end diff --git a/qa/qa/page/project/sub_menus/packages.rb b/qa/qa/page/project/sub_menus/packages.rb index 9ea045a99f5..46eae01e10d 100644 --- a/qa/qa/page/project/sub_menus/packages.rb +++ b/qa/qa/page/project/sub_menus/packages.rb @@ -22,6 +22,25 @@ module QA click_element :packages_link end end + + def go_to_container_registry + hover_registry do + within_submenu do + click_link('Container Registry') + end + end + end + + private + + def hover_registry + within_sidebar do + scroll_to_element(:packages_link) + find_element(:packages_link).hover + + yield + end + end end end end diff --git a/qa/qa/page/project/sub_menus/settings.rb b/qa/qa/page/project/sub_menus/settings.rb index 47274c8db54..b5058bacccd 100644 --- a/qa/qa/page/project/sub_menus/settings.rb +++ b/qa/qa/page/project/sub_menus/settings.rb @@ -25,7 +25,7 @@ module QA def go_to_ci_cd_settings hover_settings do within_submenu do - click_link('CI / CD') + click_link('CI/CD') end end end diff --git a/qa/qa/page/project/web_ide/edit.rb b/qa/qa/page/project/web_ide/edit.rb index 45c46004790..fd68ac0de16 100644 --- a/qa/qa/page/project/web_ide/edit.rb +++ b/qa/qa/page/project/web_ide/edit.rb @@ -44,10 +44,6 @@ module QA element :commit_button end - view 'app/assets/javascripts/ide/components/commit_sidebar/new_merge_request_option.vue' do - element :start_new_mr_checkbox - end - view 'app/assets/javascripts/ide/components/repo_editor.vue' do element :editor_container end diff --git a/qa/qa/page/project/wiki/edit.rb b/qa/qa/page/project/wiki/edit.rb index 6f3be904eb3..70aa10cc43e 100644 --- a/qa/qa/page/project/wiki/edit.rb +++ b/qa/qa/page/project/wiki/edit.rb @@ -5,44 +5,8 @@ module QA module Project module Wiki class Edit < Base - include Wiki::Sidebar - - view 'app/views/shared/wikis/_form.html.haml' do - element :wiki_title_textbox - element :wiki_content_textarea - element :wiki_message_textbox - element :save_changes_button - element :create_page_button - end - - view 'app/assets/javascripts/pages/shared/wikis/components/delete_wiki_modal.vue' do - element :delete_button - end - - def set_title(title) - fill_element :wiki_title_textbox, title - end - - def set_content(content) - fill_element :wiki_content_textarea, content - end - - def set_message(message) - fill_element :wiki_message_textbox, message - end - - def click_save_changes - click_element :save_changes_button - end - - def click_create_page - click_element :create_page_button - end - - def delete_page - click_element :delete_button, Page::Modal::DeleteWiki - Page::Modal::DeleteWiki.perform(&:confirm_deletion) - end + include Page::Component::WikiPageForm + include Page::Component::WikiSidebar end end end diff --git a/qa/qa/page/project/wiki/show.rb b/qa/qa/page/project/wiki/show.rb index d9e0783a581..f3573e3cdd3 100644 --- a/qa/qa/page/project/wiki/show.rb +++ b/qa/qa/page/project/wiki/show.rb @@ -5,67 +5,9 @@ module QA module Project module Wiki class Show < Base - include Wiki::Sidebar - include Component::LazyLoader - - view 'app/views/shared/wikis/show.html.haml' do - element :wiki_page_title - element :wiki_page_content - element :edit_page_button - end - - view 'app/views/shared/wikis/_main_links.html.haml' do - element :new_page_button - element :page_history_button - end - - view 'app/views/shared/empty_states/_wikis.html.haml' do - element :create_first_page_link - end - - view 'app/views/shared/empty_states/_wikis_layout.html.haml' do - element :svg_content - end - - def click_create_your_first_page - # The svg takes a fraction of a second to load after which the - # "Create your first page" button shifts up a bit. This can cause - # webdriver to miss the hit so we wait for the svg to load before - # clicking the button. - within_element(:svg_content) do - has_element? :js_lazy_loaded - end - - click_element :create_first_page_link - end - - def click_new_page - click_element(:new_page_button) - end - - def click_page_history - click_element(:page_history_button) - end - - def click_edit - click_element(:edit_page_button) - end - - def has_title?(title) - has_element?(:wiki_page_title, title) - end - - def has_content?(content) - has_element?(:wiki_page_content, content) - end - - def has_no_content?(content) - has_no_element?(:wiki_page_content, content) - end - - def has_no_page? - has_element? :create_first_page_link - end + include Page::Component::Wiki + include Page::Component::WikiSidebar + include Page::Component::LazyLoader end end end diff --git a/qa/qa/page/project/wiki/sidebar.rb b/qa/qa/page/project/wiki/sidebar.rb deleted file mode 100644 index 3e1edcbbefb..00000000000 --- a/qa/qa/page/project/wiki/sidebar.rb +++ /dev/null @@ -1,50 +0,0 @@ -# frozen_string_literal: true - -module QA - module Page - module Project - module Wiki - module Sidebar - extend QA::Page::PageConcern - - def self.included(base) - super - - base.view 'app/views/shared/wikis/_sidebar.html.haml' do - element :clone_repository_link - element :view_all_pages_button - end - - base.view 'app/views/shared/wikis/_sidebar_wiki_page.html.haml' do - element :wiki_page_link - end - - base.view 'app/views/shared/wikis/_wiki_directory.html.haml' do - element :wiki_directory_content - end - end - - def click_clone_repository - click_element(:clone_repository_link) - end - - def click_view_all_pages - click_element(:view_all_pages_button) - end - - def click_page_link(page_title) - click_element :wiki_page_link, page_name: page_title - end - - def has_page_listed?(page_title) - has_element? :wiki_page_link, page_name: page_title - end - - def has_directory?(directory) - has_element? :wiki_directory_content, text: directory - end - end - end - end - end -end -- cgit v1.2.1