aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch/testing/assertions/selector.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_dispatch/testing/assertions/selector.rb')
-rw-r--r--actionpack/lib/action_dispatch/testing/assertions/selector.rb40
1 files changed, 35 insertions, 5 deletions
diff --git a/actionpack/lib/action_dispatch/testing/assertions/selector.rb b/actionpack/lib/action_dispatch/testing/assertions/selector.rb
index feb98f7e2b..6151491238 100644
--- a/actionpack/lib/action_dispatch/testing/assertions/selector.rb
+++ b/actionpack/lib/action_dispatch/testing/assertions/selector.rb
@@ -162,7 +162,7 @@ module ActionDispatch
selector = filter.css_selector
equals = filter.comparisons
- matches = filter.root.css(selector)
+ matches = filter.root.css(selector, filter.substitution_context)
content_mismatch = nil
matches = filter_matches(matches, equals) do |mismatch|
content_mismatch ||= mismatch
@@ -350,10 +350,7 @@ module ActionDispatch
# First or second argument is the selector
selector = @css_selector_is_second_argument ? args.shift(2).last : args.shift
- unless selector.is_a? String
- raise ArgumentError, "Expecting a selector as the first argument"
- end
- @css_selector = selector
+ @css_selector = selector_from(selector, args)
# Next argument is used for equality tests.
@comparisons = comparisons_from(args.shift)
@@ -384,6 +381,39 @@ module ActionDispatch
end
end
+ def selector_from(selector, substitution_values)
+ unless selector.is_a? String
+ raise ArgumentError, "Expecting a selector as the first argument"
+ end
+ while selector.index('?')
+ break if substitution_values.empty?
+ value = substitution_values.shift
+ if value.is_a?(Regexp)
+ value = substitution_context.add_regex value
+ end
+ selector.sub!('?', value)
+ end
+ selector
+ end
+
+ # used for regex substitution in selectors
+ def substitution_context
+ @substitution_context ||= Class.new do
+ # +regex+ will be a +String+
+ def match(matches, attribute, regex)
+ matches.find_all { |node| node[attribute] =~ @regexes[regex] }
+ end
+
+ def add_regex(regex)
+ @regexes ||= []
+ @regexes.push(regex)
+ id_for(regex)
+ end
+
+ def id_for(regex); @regexes.index(regex).to_s; end
+ end.new
+ end
+
def comparisons_from(comparator)
comparisons = {}
case comparator