diff options
Diffstat (limited to 'qa')
-rw-r--r-- | qa/qa.rb | 15 | ||||
-rw-r--r-- | qa/qa/page/component/users_select.rb | 14 | ||||
-rw-r--r-- | qa/qa/page/main/login.rb | 9 | ||||
-rw-r--r-- | qa/qa/page/project/menu.rb | 9 | ||||
-rw-r--r-- | qa/qa/page/project/settings/members.rb | 27 | ||||
-rw-r--r-- | qa/qa/runtime/browser.rb | 4 | ||||
-rw-r--r-- | qa/qa/runtime/env.rb | 4 | ||||
-rw-r--r-- | qa/qa/scenario/test/integration/instance_saml.rb | 13 | ||||
-rw-r--r-- | qa/qa/specs/features/browser_ui/1_manage/login/login_via_instance_wide_saml_sso_spec.rb | 17 | ||||
-rw-r--r-- | qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb | 27 | ||||
-rw-r--r-- | qa/qa/vendor/saml_idp/page/base.rb | 14 | ||||
-rw-r--r-- | qa/qa/vendor/saml_idp/page/login.rb | 19 | ||||
-rw-r--r-- | qa/spec/scenario/test/integration/instance_saml_spec.rb | 9 |
13 files changed, 181 insertions, 0 deletions
@@ -97,6 +97,7 @@ module QA module Integration autoload :Github, 'qa/scenario/test/integration/github' autoload :LDAP, 'qa/scenario/test/integration/ldap' + autoload :InstanceSAML, 'qa/scenario/test/integration/instance_saml' autoload :Kubernetes, 'qa/scenario/test/integration/kubernetes' autoload :Mattermost, 'qa/scenario/test/integration/mattermost' autoload :ObjectStorage, 'qa/scenario/test/integration/object_storage' @@ -180,6 +181,7 @@ module QA autoload :SecretVariables, 'qa/page/project/settings/secret_variables' autoload :Runners, 'qa/page/project/settings/runners' autoload :MergeRequest, 'qa/page/project/settings/merge_request' + autoload :Members, 'qa/page/project/settings/members' end module Issue @@ -267,6 +269,7 @@ module QA autoload :GroupsFilter, 'qa/page/component/groups_filter' autoload :Select2, 'qa/page/component/select2' autoload :DropdownFilter, 'qa/page/component/dropdown_filter' + autoload :UsersSelect, 'qa/page/component/users_select' module Issuable autoload :Common, 'qa/page/component/issuable/common' @@ -300,6 +303,18 @@ module QA autoload :Config, 'qa/specs/config' autoload :Runner, 'qa/specs/runner' end + + ## + # Classes that describe the structure of vendor/third party application pages + # + module Vendor + module SAMLIdp + module Page + autoload :Base, 'qa/vendor/saml_idp/page/base' + autoload :Login, 'qa/vendor/saml_idp/page/login' + end + end + end end QA::Runtime::Release.extend_autoloads! diff --git a/qa/qa/page/component/users_select.rb b/qa/qa/page/component/users_select.rb new file mode 100644 index 00000000000..f88d6450a33 --- /dev/null +++ b/qa/qa/page/component/users_select.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module QA + module Page + module Component + module UsersSelect + def select_user(element, username) + find("#{element_selector_css(element)} input").set(username) + find('.ajax-users-dropdown .user-username', text: "@#{username}").click + end + end + end + end +end diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb index eab7a85ff04..94b9486b0d5 100644 --- a/qa/qa/page/main/login.rb +++ b/qa/qa/page/main/login.rb @@ -31,6 +31,10 @@ module QA element :register_tab end + view 'app/views/devise/shared/_omniauth_box.html.haml' do + element :saml_login_button + end + def initialize # The login page is usually the entry point for all the scenarios so # we need to wait for the instance to start. That said, in some cases @@ -130,6 +134,11 @@ module QA click_element :sign_in_button end + def sign_in_with_saml + set_initial_password_if_present + click_element :saml_login_button + end + def sign_in_using_gitlab_credentials(user) switch_to_sign_in_tab if has_sign_in_tab? switch_to_standard_tab if has_standard_tab? diff --git a/qa/qa/page/project/menu.rb b/qa/qa/page/project/menu.rb index d9f01c50f19..63c719e5fe1 100644 --- a/qa/qa/page/project/menu.rb +++ b/qa/qa/page/project/menu.rb @@ -9,6 +9,7 @@ module QA element :settings_link, 'link_to edit_project_path' element :repository_link, "title: _('Repository')" element :link_pipelines + element :link_members_settings element :pipelines_settings_link, "title: _('CI / CD')" element :operations_kubernetes_link, "title: _('Kubernetes')" element :operations_environments_link @@ -51,6 +52,14 @@ module QA end end + def click_members_settings + hover_settings do + within_submenu do + click_element :link_members_settings + end + end + end + def click_operations_kubernetes hover_operations do within_submenu do diff --git a/qa/qa/page/project/settings/members.rb b/qa/qa/page/project/settings/members.rb new file mode 100644 index 00000000000..7fed93ca83f --- /dev/null +++ b/qa/qa/page/project/settings/members.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module QA + module Page + module Project + module Settings + class Members < Page::Base + include Page::Component::UsersSelect + + view 'app/views/projects/project_members/_new_project_member.html.haml' do + element :member_select_input + element :add_member_button + end + + view 'app/views/projects/project_members/_team.html.haml' do + element :members_list + end + + def add_member(username) + select_user :member_select_input, username + click_element :add_member_button + end + end + end + end + end +end diff --git a/qa/qa/runtime/browser.rb b/qa/qa/runtime/browser.rb index 4c64270ce92..9aaf57e8d83 100644 --- a/qa/qa/runtime/browser.rb +++ b/qa/qa/runtime/browser.rb @@ -51,6 +51,10 @@ module QA } ) + if QA::Runtime::Env.accept_insecure_certs? + capabilities['acceptInsecureCerts'] = true + end + options = Selenium::WebDriver::Chrome::Options.new options.add_argument("window-size=1240,1680") diff --git a/qa/qa/runtime/env.rb b/qa/qa/runtime/env.rb index 5bebb5ccec0..4a2109799fa 100644 --- a/qa/qa/runtime/env.rb +++ b/qa/qa/runtime/env.rb @@ -8,6 +8,10 @@ module QA enabled?(ENV['CHROME_HEADLESS']) end + def accept_insecure_certs? + enabled?(ENV['ACCEPT_INSECURE_CERTS']) + end + def running_in_ci? ENV['CI'] || ENV['CI_SERVER'] end diff --git a/qa/qa/scenario/test/integration/instance_saml.rb b/qa/qa/scenario/test/integration/instance_saml.rb new file mode 100644 index 00000000000..0697d0c2a0e --- /dev/null +++ b/qa/qa/scenario/test/integration/instance_saml.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module QA + module Scenario + module Test + module Integration + class InstanceSAML < Test::Instance::All + tags :instance_saml + end + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/login_via_instance_wide_saml_sso_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/login_via_instance_wide_saml_sso_spec.rb new file mode 100644 index 00000000000..8d5055aab45 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/1_manage/login/login_via_instance_wide_saml_sso_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module QA + context :manage, :orchestrated, :instance_saml do + describe 'Instance wide SAML SSO' do + it 'User logs in to gitlab with SAML SSO' do + Runtime::Browser.visit(:gitlab, Page::Main::Login) + + Page::Main::Login.act { sign_in_with_saml } + + Vendor::SAMLIdp::Page::Login.act { login } + + expect(page).to have_content('Welcome to GitLab') + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb new file mode 100644 index 00000000000..b276c7ee579 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module QA + context :manage do + describe 'Add project member' do + it 'user adds project member' do + Runtime::Browser.visit(:gitlab, Page::Main::Login) + + user = Factory::Resource::User.fabricate! + + Page::Main::Menu.perform { |main| main.sign_out } + Page::Main::Login.act { sign_in_using_credentials } + + Factory::Resource::Project.fabricate! do |resource| + resource.name = 'add-member-project' + end + + Page::Project::Menu.act { click_members_settings } + Page::Project::Settings::Members.perform do |page| + page.add_member(user.username) + end + + expect(page).to have_content("#{user.name} @#{user.username} Given access") + end + end + end +end diff --git a/qa/qa/vendor/saml_idp/page/base.rb b/qa/qa/vendor/saml_idp/page/base.rb new file mode 100644 index 00000000000..286cb0a8cd8 --- /dev/null +++ b/qa/qa/vendor/saml_idp/page/base.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module QA + module Vendor + module SAMLIdp + module Page + class Base + include Capybara::DSL + include Scenario::Actable + end + end + end + end +end diff --git a/qa/qa/vendor/saml_idp/page/login.rb b/qa/qa/vendor/saml_idp/page/login.rb new file mode 100644 index 00000000000..9c1f9904a7a --- /dev/null +++ b/qa/qa/vendor/saml_idp/page/login.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require 'capybara/dsl' + +module QA + module Vendor + module SAMLIdp + module Page + class Login < Page::Base + def login + fill_in 'username', with: 'user1' + fill_in 'password', with: 'user1pass' + click_on 'Login' + end + end + end + end + end +end diff --git a/qa/spec/scenario/test/integration/instance_saml_spec.rb b/qa/spec/scenario/test/integration/instance_saml_spec.rb new file mode 100644 index 00000000000..cb8a6a630cc --- /dev/null +++ b/qa/spec/scenario/test/integration/instance_saml_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +describe QA::Scenario::Test::Integration::InstanceSAML do + context '#perform' do + it_behaves_like 'a QA scenario class' do + let(:tags) { [:instance_saml] } + end + end +end |