Module: Rails::Dom::Testing::Assertions::SelectorAssertions
- Defined in:
- lib/jquery/assert_select.rb
Constant Summary collapse
- PATTERN_HTML =
Selects content from a JQuery response. Patterned loosely on assert_select_rjs.
Narrowing down
With no arguments, asserts that one or more method calls are made.
Use the
method
argument to narrow down the assertion to only statements that call that specific method.Use the
opt
argument to narrow down the assertion to only statements that passopt
as the first argument.Use the
id
argument to narrow down the assertion to only statements that invoke methods on the result of using that identifier as a selector.Using blocks
Without a block, +assert_select_jquery_ merely asserts that the response contains one or more statements that match the conditions specified above
With a block +assert_select_jquery_ also asserts that the method call passes a javascript escaped string containing HTML. All such HTML fragments are selected and passed to the block. Nested assertions are supported.
Examples
# asserts that the #notice element is hidden assert_select :hide, ‘#notice’
# asserts that the #cart element is shown with a blind parameter assert_select :show, :blind, ‘#cart’
# asserts that #cart content contains a #current_item assert_select :html, ‘#cart’ do
assert_select '#current_item'
end
# asserts that #product append to a #product_list assert_select_jquery :appendTo, ‘#product_list’ do
assert_select '.product'
end
"['\"]((\\\\\"|[^\"])*)['\"]"
- PATTERN_UNICODE_ESCAPED_CHAR =
/\\u([0-9a-zA-Z]{4})/
- SKELETAL_PATTERN =
"(?:jQuery|\\$)\\(%s\\)\\.%s\\(%s\\);"
Instance Method Summary collapse
Instance Method Details
#assert_select_jquery(*args, &block) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/jquery/assert_select.rb', line 54 def assert_select_jquery(*args, &block) jquery_method = args.first.is_a?(Symbol) ? args.shift : nil jquery_opt = args.first.is_a?(Symbol) ? args.shift : nil id = args.first.is_a?(String) ? escape_id(args.shift) : nil target_pattern = "['\"]#{id || '.*'}['\"]" method_pattern = "#{jquery_method || '\\w+'}" argument_pattern = jquery_opt ? "['\"]#{jquery_opt}['\"].*" : PATTERN_HTML # $("#id").show('blind', 1000); # $("#id").html("<div>something</div>"); # $("#id").replaceWith("<div>something</div>"); target_as_receiver_pattern = SKELETAL_PATTERN % [target_pattern, method_pattern, argument_pattern] # $("<div>something</div>").appendTo("#id"); # $("<div>something</div>").prependTo("#id"); target_as_argument_pattern = SKELETAL_PATTERN % [argument_pattern, method_pattern, target_pattern] # $("#id").remove(); # $("#id").hide(); argumentless_pattern = SKELETAL_PATTERN % [target_pattern, method_pattern, ''] patterns = [target_as_receiver_pattern, target_as_argument_pattern] patterns << argumentless_pattern unless jquery_opt matched_pattern = nil patterns.each do |pattern| if response.body.match(Regexp.new(pattern)) matched_pattern = pattern break end end unless matched_pattern opts = [jquery_method, jquery_opt, id].compact flunk "No JQuery call matches #{opts.inspect}" end if block_given? @selected ||= nil fragments = Nokogiri::HTML::Document.new if matched_pattern response.body.scan(Regexp.new(matched_pattern)).each do |match| flunk 'This function can\'t have HTML argument' if match.is_a?(String) doc = Nokogiri::HTML::Document.parse(unescape_js(match.first)) doc.root.children.each do |child| fragments << child if child.element? end end end begin in_scope, @selected = @selected, fragments yield ensure @selected = in_scope end end end |