lib/howitzer/web/page_validator.rb in howitzer-2.2.0 vs lib/howitzer/web/page_validator.rb in howitzer-2.3.0
- old
+ new
@@ -4,11 +4,11 @@
module Web
# This module combines page validation methods
module PageValidator
@validations = {}
- def self.included(base) #:nodoc:
+ def self.included(base) # :nodoc:
base.extend(ClassMethods)
end
# @return [Hash] defined validations for all page classes
@@ -26,15 +26,16 @@
end
# This module holds page validation class methods
module ClassMethods
# Adds validation to validation list for current page
- # @param name [Symbol, String] a validation type. Possible values [:url, :element_presence, :title]
- # @param value [Symbol, String, Regexp]
+ # @param type [Symbol, String] a validation type. Possible values [:url, :element_presence, :title]
+ # @param pattern_or_element_name [Symbol, String, Regexp]
# For :url and :title validation types must be <b>Regexp</b>
- # For :element_presence must be one of element names described for page
- # @param additional_value [Object, nil] any value required to pass for a labmda selector
+ # For :element_presence must be one of element names described for the page
+ # @param args [Array] any arguments required to pass for a lambda selector (:element_presence type only)
+ # @param options [Hash] keyword arguments required to pass for a lambda selector (:element_presence type only)
# @raise [Howitzer::UnknownValidationError] if unknown validation type
# @raise [Howitzer::UndefinedElementError] if :element_presence validations refers to undefined element name
# @example
# class ArticleListPage < Howitzer::Web::Page
# validate :title, /\ADemo web application - Listing Articles\z/
@@ -43,16 +44,27 @@
# class ArticlePage < Howitzer::Web::Page
# validate :url, %r{\/articles\/\d+\/?\z}
# end
# @example
# class HomePage < Howitzer::Web::Page
- # validate :element_presence, :menu_item, 'Logout'
- # element :menu_item, :xpath, ->(name) { ".//a[.='#{name}']" }
+ # validate :element_presence, :menu_item, lambda_args(text: 'Logout')
+ # element :menu_item, :xpath, ->(text:) { ".//a[.='#{text}']" }
# end
- def validate(name, value, additional_value = nil)
- validate_by_type(name, value, additional_value)
+ def validate(type, pattern_or_element_name, *args, **options)
+ case type.to_s.to_sym
+ when :url, :title
+ if args.present? || options.present?
+ raise ArgumentError, "Additional arguments and options are not supported by '#{type}' the validator"
+ end
+
+ send("validate_by_#{type}", pattern_or_element_name)
+ when :element_presence
+ validate_by_element_presence(pattern_or_element_name, *args, **options)
+ else
+ raise Howitzer::UnknownValidationError, "unknown '#{type}' validation type"
+ end
end
# Check whether current page is opened or no
# @param sync [Boolean] if true then waits until validation true during Howitzer.capybara_wait_time
# or returns false. If false, returns result immediately
@@ -78,21 +90,21 @@
PageValidator.validations[self] ||= {}
end
private
- def validate_element(element_name, value = nil)
+ def validate_by_element_presence(element_name, *args, **options)
validations[:element_presence] =
lambda do |web_page, sync|
if element_name.present? && !private_method_defined?("#{element_name}_element")
raise(Howitzer::UndefinedElementError, ':element_presence validation refers to ' \
- "undefined '#{element_name}' element on '#{name}' page.")
+ "undefined '#{element_name}' element on '#{name}' page.")
end
if sync
- web_page.instance.public_send(*["has_#{element_name}_element?", value].compact)
+ web_page.instance.public_send("has_#{element_name}_element?", *args, **options)
else
- !web_page.instance.public_send(*["has_no_#{element_name}_element?", value].compact)
+ !web_page.instance.public_send("has_no_#{element_name}_element?", *args, **options)
end
end
end
def validate_by_url(pattern)
@@ -101,22 +113,9 @@
end
def validate_by_title(pattern)
validations[:title] =
->(web_page, sync) { sync ? web_page.instance.has_title?(pattern) : pattern === web_page.instance.title }
- end
-
- def validate_by_type(type, value, additional_value)
- case type.to_s.to_sym
- when :url
- validate_by_url(value)
- when :element_presence
- validate_element(value, additional_value)
- when :title
- validate_by_title(value)
- else
- raise Howitzer::UnknownValidationError, "unknown '#{type}' validation type"
- end
end
end
end
end
end