lib/spec/rails/matchers/assert_select.rb in rspec-rails-1.2.4 vs lib/spec/rails/matchers/assert_select.rb in rspec-rails-1.2.5

- old
+ new

@@ -3,15 +3,16 @@ module Spec # :nodoc: module Rails module Matchers class AssertSelect #:nodoc: - - def initialize(assertion, spec_scope, *args, &block) - @assertion = assertion + attr_reader :options + + def initialize(selector_assertion, spec_scope, *args, &block) + @args, @options = args_and_options(args) @spec_scope = spec_scope - @args = args + @selector_assertion = selector_assertion @block = block end def matches?(response_or_text, &block) @block = block if block @@ -19,11 +20,11 @@ if doc = doc_from(response_or_text) @args.unshift(doc) end begin - @spec_scope.__send__(@assertion, *@args, &@block) + @spec_scope.__send__(@selector_assertion, *@args, &@block) true rescue ::Test::Unit::AssertionFailedError => @error false end end @@ -33,11 +34,11 @@ def description { :assert_select => "have tag#{format_args(*@args)}", :assert_select_email => "send email#{format_args(*@args)}", - }[@assertion] + }[@selector_assertion] end private module TestResponseOrString @@ -52,41 +53,60 @@ end end def doc_from(response_or_text) response_or_text.extend TestResponseOrString - markup = response_or_text.body if response_or_text.test_response? - markup = response_or_text if response_or_text.string? - HTML::Document.new(markup, false, true).root if markup + if response_or_text.test_response? + HTML::Document.new(response_or_text.body, @options[:strict], @options[:xml]).root + elsif response_or_text.string? + HTML::Document.new(response_or_text, @options[:strict], @options[:xml]).root + end end - + def format_args(*args) args.empty? ? "" : "(#{arg_list(*args)})" end def arg_list(*args) args.map do |arg| arg.respond_to?(:description) ? arg.description : arg.inspect end.join(", ") end + def args_and_options(args) + opts = {:xml => false, :strict => false} + if args.last.is_a?(::Hash) + opts[:strict] = args.last.delete(:strict) unless args.last[:strict].nil? + opts[:xml] = args.last.delete(:xml) unless args.last[:xml].nil? + args.pop if args.last.empty? + end + return [args, opts] + end + end # :call-seq: # response.should have_tag(*args, &block) # string.should have_tag(*args, &block) # # wrapper for assert_select with additional support for using # css selectors to set expectation on Strings. Use this in # helper specs, for example, to set expectations on the results - # of helper methods. + # of helper methods. Also allow specification of how the + # response is parsed using the options :xml and :strict options. + # By default, these options are set to false. # # == Examples # # # in a controller spec # response.should have_tag("div", "some text") # + # # to force xml and/or strict parsing of the response + # response.should have_tag("div", "some text", :xml => true) + # response.should have_tag("div", "some text", :strict => true) + # response.should have_tag("div", "some text", :xml => true, :strict => false) + # # # in a helper spec (person_address_tag is a method in the helper) # person_address_tag.should have_tag("input#person_address") # # see documentation for assert_select at http://api.rubyonrails.org/ def have_tag(*args, &block) @@ -99,10 +119,11 @@ # with_tag("input#person_name[name=?]", "person[name]") # end # # see documentation for assert_select at http://api.rubyonrails.org/ def with_tag(*args, &block) + args = prepare_args(args, @__current_scope_for_assert_select) @__current_scope_for_assert_select.should have_tag(*args, &block) end # wrapper for a nested assert_select with false # @@ -110,10 +131,11 @@ # without_tag("span", "some text that shouldn't be there") # end # # see documentation for assert_select at http://api.rubyonrails.org/ def without_tag(*args, &block) + args = prepare_args(args, @__current_scope_for_assert_select) @__current_scope_for_assert_select.should_not have_tag(*args, &block) end # :call-seq: # response.should have_rjs(*args, &block) @@ -139,8 +161,20 @@ # # see documentation for assert_select_encoded at http://api.rubyonrails.org/ def with_encoded(*args, &block) should AssertSelect.new(:assert_select_encoded, self, *args, &block) end + + private + + def prepare_args(args, current_scope = nil) + return args if current_scope.nil? + defaults = current_scope.options || {:strict => false, :xml => false} + args << {} unless args.last.is_a?(::Hash) + args.last[:strict] = defaults[:strict] if args.last[:strict].nil? + args.last[:xml] = defaults[:xml] if args.last[:xml].nil? + args + end + end end end