Module: ActionDispatch::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 pass opt 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

"\"((\\\\\"|[^\"])*)\""
PATTERN_UNICODE_ESCAPED_CHAR =
/\\u([0-9a-zA-Z]{4})/

Instance Method Summary collapse

Instance Method Details

#assert_select_jquery(*args, &block) ⇒ Object



48
49
50
51
52
53
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
# File 'lib/jquery/assert_select.rb', line 48

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) ? args.shift : nil

  pattern = "\\.#{jquery_method || '\\w+'}\\("
  pattern = "#{pattern}['\"]#{jquery_opt}['\"],?\\s*" if jquery_opt
  pattern = "#{pattern}#{PATTERN_HTML}"
  pattern = "(?:jQuery|\\$)\\(['\"]#{id}['\"]\\)#{pattern}" if id

  fragments = []
  response.body.scan(Regexp.new(pattern)).each do |match|
    doc = HTML::Document.new(unescape_js(match.first))
    doc.root.children.each do |child|
      fragments.push child if child.tag?
    end
  end

  if fragments.empty?
    opts = [jquery_method, jquery_opt, id].compact
    flunk "No JQuery call matches #{opts.inspect}"
  end

  if block
    begin
      in_scope, @selected = @selected, fragments
      yield
    ensure
      @selected = in_scope
    end
  end
end