summaryrefslogtreecommitdiff
path: root/qa
diff options
context:
space:
mode:
Diffstat (limited to 'qa')
-rw-r--r--qa/qa.rb1
-rw-r--r--qa/qa/page/base.rb4
-rw-r--r--qa/qa/page/element.rb19
-rw-r--r--qa/qa/page/main/login.rb36
-rw-r--r--qa/qa/page/menu/main.rb39
-rw-r--r--qa/qa/page/validatable.rb19
-rw-r--r--qa/qa/page/view.rb4
-rw-r--r--qa/qa/runtime/browser.rb1
8 files changed, 80 insertions, 43 deletions
diff --git a/qa/qa.rb b/qa/qa.rb
index 0b48cf58766..2a29a31da93 100644
--- a/qa/qa.rb
+++ b/qa/qa.rb
@@ -109,6 +109,7 @@ module QA
autoload :View, 'qa/page/view'
autoload :Element, 'qa/page/element'
autoload :Validator, 'qa/page/validator'
+ autoload :Validatable, 'qa/page/validatable'
module Main
autoload :Login, 'qa/page/main/login'
diff --git a/qa/qa/page/base.rb b/qa/qa/page/base.rb
index 30e35bf7abb..10e790ff547 100644
--- a/qa/qa/page/base.rb
+++ b/qa/qa/page/base.rb
@@ -5,6 +5,7 @@ module QA
class Base
include Capybara::DSL
include Scenario::Actable
+ extend Validatable
extend SingleForwardable
def_delegators :evaluator, :view, :views
@@ -68,8 +69,9 @@ module QA
all(element_selector_css(name))
end
- def click_element(name)
+ def click_element(name, page = self)
find_element(name).click
+ page.validate_elements_present!
end
def fill_element(name, content)
diff --git a/qa/qa/page/element.rb b/qa/qa/page/element.rb
index 9944a39ce07..cc81b8884ca 100644
--- a/qa/qa/page/element.rb
+++ b/qa/qa/page/element.rb
@@ -1,19 +1,28 @@
module QA
module Page
class Element
- attr_reader :name
+ attr_reader :name, :required
- def initialize(name, pattern = nil)
+ def initialize(name, required = true)
@name = name
- @pattern = pattern || selector
+
+ unless !!required == required
+ warn "[QA] DEPRECATED TYPING: element #{name}, #{required} should be a boolean!"
+ end
+
+ @required = required
+ end
+
+ def required?
+ !!required
end
def selector
- "qa-#{@name.to_s.tr('_', '-')}"
+ /['"]data-qa-selector['"]: ['"]#{@name}['"]/
end
def selector_css
- ".#{selector}"
+ %Q([data-qa-selector="#{@name}"])
end
def expression
diff --git a/qa/qa/page/main/login.rb b/qa/qa/page/main/login.rb
index 6cdfbd1c125..089bb49f5c9 100644
--- a/qa/qa/page/main/login.rb
+++ b/qa/qa/page/main/login.rb
@@ -3,31 +3,31 @@ module QA
module Main
class Login < Page::Base
view 'app/views/devise/passwords/edit.html.haml' do
- element :password_field, 'password_field :password'
- element :password_confirmation, 'password_field :password_confirmation'
- element :change_password_button, 'submit "Change your password"'
+ element :txt_password, false
+ element :txt_password, false
+ element :btn_change_password, false
end
view 'app/views/devise/sessions/_new_base.html.haml' do
- element :login_field, 'text_field :login'
- element :password_field, 'password_field :password'
- element :sign_in_button, 'submit "Sign in"'
+ element :txt_username
+ element :txt_password
+ element :btn_signin
end
view 'app/views/devise/sessions/_new_ldap.html.haml' do
- element :username_field, 'text_field_tag :username'
- element :password_field, 'password_field_tag :password'
- element :sign_in_button, 'submit_tag "Sign in"'
+ element :txt_username
+ element :txt_password
+ element :btn_signin
end
view 'app/views/devise/shared/_tabs_ldap.html.haml' do
- element :ldap_tab, "link_to server['label']"
- element :standard_tab, "link_to 'Standard'"
+ element :ldap_tab, false
+ element :standard_tab, false
end
view 'app/views/devise/shared/_tabs_normal.html.haml' do
- element :sign_in_tab, /nav-link.*login-pane.*Sign in/
- element :register_tab, /nav-link.*register-pane.*Register/
+ element :tab_standard
+ element :tab_register
end
def initialize
@@ -62,11 +62,11 @@ module QA
end
def switch_to_sign_in_tab
- click_on 'Sign in'
+ click_element :tab_standard
end
def switch_to_register_tab
- click_on 'Register'
+ click_element :tab_register
end
private
@@ -82,9 +82,9 @@ module QA
def sign_in_using_gitlab_credentials
click_link 'Standard' if page.has_content?('LDAP')
- fill_in :user_login, with: Runtime::User.name
- fill_in :user_password, with: Runtime::User.password
- click_button 'Sign in'
+ fill_element :txt_username, Runtime::User.name
+ fill_element :txt_password, Runtime::User.password
+ click_element :btn_signin, Page::Menu::Main
end
def set_initial_password_if_present
diff --git a/qa/qa/page/menu/main.rb b/qa/qa/page/menu/main.rb
index 36e7285f7b7..00c6508cefa 100644
--- a/qa/qa/page/menu/main.rb
+++ b/qa/qa/page/menu/main.rb
@@ -3,49 +3,54 @@ module QA
module Menu
class Main < Page::Base
view 'app/views/layouts/header/_current_user_dropdown.html.haml' do
- element :user_sign_out_link, 'link_to _("Sign out")'
- element :settings_link, 'link_to s_("CurrentUser|Settings")'
+ element :btn_signout
+ element :btn_settings
end
view 'app/views/layouts/header/_default.html.haml' do
element :navbar
element :user_avatar
- element :user_menu, '.dropdown-menu'
+ element :drp_user
end
view 'app/views/layouts/nav/_dashboard.html.haml' do
- element :admin_area_link
- element :projects_dropdown
- element :groups_dropdown
+ element :lnk_adminarea
+ element :drp_projects
+ element :drp_groups
end
view 'app/views/layouts/nav/projects_dropdown/_show.html.haml' do
- element :projects_dropdown_sidebar
- element :your_projects_link
+ element :drp_projects_sidebar
+ element :drp_projects_sidebar_lnk_yourprojects
+ end
+
+ view 'app/views/layouts/nav/groups_dropdown/_show.html.haml' do
+ element :drp_groups_sidebar
+ element :drp_groups_sidebar_lnk_yourgroups
end
def go_to_groups
within_top_menu do
- click_element :groups_dropdown
+ click_element :drp_groups
end
- page.within('.qa-groups-dropdown-sidebar') do
- click_element :your_groups_link
+ page.within_element(:drp_groups_sidebar) do
+ click_element :drp_groups_sidebar_lnk_yourgroups
end
end
def go_to_projects
within_top_menu do
- click_element :projects_dropdown
+ click_element :drp_projects
end
- page.within('.qa-projects-dropdown-sidebar') do
- click_element :your_projects_link
+ page.within_element(:drp_projects_sidebar) do
+ click_element :drp_projects_sidebar_lnk_yourprojects
end
end
def go_to_admin_area
- within_top_menu { click_element :admin_area_link }
+ within_top_menu { click_element :lnk_adminarea }
end
def sign_out
@@ -68,7 +73,7 @@ module QA
private
def within_top_menu
- page.within('.qa-navbar') do
+ page.within_element(:navbar) do
yield
end
end
@@ -77,7 +82,7 @@ module QA
within_top_menu do
click_element :user_avatar
- page.within('.dropdown-menu') do
+ page.within_element(:drp_user) do
yield
end
end
diff --git a/qa/qa/page/validatable.rb b/qa/qa/page/validatable.rb
new file mode 100644
index 00000000000..1d885915f74
--- /dev/null
+++ b/qa/qa/page/validatable.rb
@@ -0,0 +1,19 @@
+module QA
+ module Page
+ module Validatable
+ PageValidationError = Class.new(StandardError)
+
+ def validate_elements_present!
+ # get elements from self
+ elements.each do |element|
+ if element.required?
+ base_page = self.new
+ unless base_page.using_wait_time(10) { base_page.page.has_selector?(element.selector_css) }
+ raise Validatable::PageValidationError, "#{element.name} expected on #{self.name} page"
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/qa/qa/page/view.rb b/qa/qa/page/view.rb
index b2a2da4dbf3..9ee17d54c22 100644
--- a/qa/qa/page/view.rb
+++ b/qa/qa/page/view.rb
@@ -46,8 +46,8 @@ module QA
@elements = []
end
- def element(name, pattern = nil)
- @elements.push(Page::Element.new(name, pattern))
+ def element(name, required = true)
+ @elements.push(Page::Element.new(name, required))
end
end
end
diff --git a/qa/qa/runtime/browser.rb b/qa/qa/runtime/browser.rb
index 4c64270ce92..a1e19441123 100644
--- a/qa/qa/runtime/browser.rb
+++ b/qa/qa/runtime/browser.rb
@@ -29,6 +29,7 @@ module QA
def self.visit(address, page = nil, &block)
new.visit(address, page, &block)
+ page.validate_elements_present!
end
def self.configure!