webrat 0.4.4 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. data/.document +4 -0
  2. data/.gitignore +15 -0
  3. data/History.txt +44 -8
  4. data/Rakefile +80 -66
  5. data/VERSION +1 -0
  6. data/lib/webrat.rb +7 -12
  7. data/lib/webrat/core/configuration.rb +7 -3
  8. data/lib/webrat/core/elements/area.rb +7 -7
  9. data/lib/webrat/core/elements/element.rb +11 -11
  10. data/lib/webrat/core/elements/field.rb +63 -55
  11. data/lib/webrat/core/elements/form.rb +17 -17
  12. data/lib/webrat/core/elements/label.rb +6 -6
  13. data/lib/webrat/core/elements/link.rb +13 -12
  14. data/lib/webrat/core/elements/select_option.rb +9 -9
  15. data/lib/webrat/core/locators.rb +2 -2
  16. data/lib/webrat/core/locators/area_locator.rb +10 -10
  17. data/lib/webrat/core/locators/button_locator.rb +13 -13
  18. data/lib/webrat/core/locators/field_by_id_locator.rb +8 -8
  19. data/lib/webrat/core/locators/field_labeled_locator.rb +11 -11
  20. data/lib/webrat/core/locators/field_locator.rb +7 -7
  21. data/lib/webrat/core/locators/field_named_locator.rb +10 -10
  22. data/lib/webrat/core/locators/form_locator.rb +6 -6
  23. data/lib/webrat/core/locators/label_locator.rb +9 -9
  24. data/lib/webrat/core/locators/link_locator.rb +21 -13
  25. data/lib/webrat/core/locators/locator.rb +5 -5
  26. data/lib/webrat/core/locators/select_option_locator.rb +11 -11
  27. data/lib/webrat/core/logging.rb +7 -4
  28. data/lib/webrat/core/matchers/have_content.rb +12 -12
  29. data/lib/webrat/core/matchers/have_selector.rb +9 -9
  30. data/lib/webrat/core/matchers/have_tag.rb +4 -4
  31. data/lib/webrat/core/matchers/have_xpath.rb +26 -26
  32. data/lib/webrat/core/methods.rb +13 -11
  33. data/lib/webrat/core/mime.rb +3 -3
  34. data/lib/webrat/core/save_and_open_page.rb +14 -16
  35. data/lib/webrat/core/scope.rb +53 -53
  36. data/lib/webrat/core/session.rb +23 -14
  37. data/lib/webrat/core/xml.rb +16 -16
  38. data/lib/webrat/core/xml/hpricot.rb +3 -3
  39. data/lib/webrat/core/xml/nokogiri.rb +11 -11
  40. data/lib/webrat/core/xml/rexml.rb +3 -3
  41. data/lib/webrat/core_extensions/blank.rb +1 -1
  42. data/lib/webrat/core_extensions/deprecate.rb +1 -1
  43. data/lib/webrat/core_extensions/detect_mapped.rb +4 -4
  44. data/lib/webrat/core_extensions/meta_class.rb +1 -1
  45. data/lib/webrat/core_extensions/tcp_socket.rb +8 -8
  46. data/lib/webrat/mechanize.rb +9 -9
  47. data/lib/webrat/merb.rb +1 -1
  48. data/lib/webrat/merb_multipart_support.rb +27 -0
  49. data/lib/webrat/merb_session.rb +39 -24
  50. data/lib/webrat/rack_test.rb +32 -0
  51. data/lib/webrat/rails.rb +2 -2
  52. data/lib/webrat/rspec-rails.rb +3 -6
  53. data/lib/webrat/selenium.rb +2 -1
  54. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  55. data/lib/webrat/selenium/application_servers.rb +5 -0
  56. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  57. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  58. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  59. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  60. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  61. data/lib/webrat/selenium/location_strategy_javascript/button.js +14 -7
  62. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +4 -1
  63. data/lib/webrat/selenium/matchers.rb +1 -1
  64. data/lib/webrat/selenium/matchers/have_content.rb +4 -4
  65. data/lib/webrat/selenium/matchers/have_selector.rb +4 -4
  66. data/lib/webrat/selenium/matchers/have_tag.rb +16 -16
  67. data/lib/webrat/selenium/matchers/have_xpath.rb +4 -4
  68. data/lib/webrat/selenium/selenium_rc_server.rb +25 -19
  69. data/lib/webrat/selenium/selenium_session.rb +24 -17
  70. data/lib/webrat/selenium/silence_stream.rb +18 -0
  71. data/spec/fakes/test_session.rb +34 -0
  72. data/spec/integration/merb/.gitignore +21 -0
  73. data/spec/integration/merb/Rakefile +35 -0
  74. data/spec/integration/merb/app/controllers/application.rb +2 -0
  75. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  76. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  77. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  78. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  79. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  80. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  81. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  82. data/spec/integration/merb/config/environments/development.rb +15 -0
  83. data/spec/integration/merb/config/environments/rake.rb +11 -0
  84. data/spec/integration/merb/config/environments/test.rb +14 -0
  85. data/spec/integration/merb/config/init.rb +25 -0
  86. data/spec/integration/merb/config/rack.rb +11 -0
  87. data/spec/integration/merb/config/router.rb +34 -0
  88. data/spec/integration/merb/spec/spec.opts +1 -0
  89. data/spec/integration/merb/spec/spec_helper.rb +24 -0
  90. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  91. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  92. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  93. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  94. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  95. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  96. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  97. data/spec/integration/rack/Rakefile +5 -0
  98. data/spec/integration/rack/rack_app.rb +16 -0
  99. data/spec/integration/rack/test/test_helper.rb +20 -0
  100. data/spec/integration/rack/test/webrat_rack_test.rb +67 -0
  101. data/spec/integration/rails/.gitignore +3 -0
  102. data/spec/integration/rails/Rakefile +30 -0
  103. data/spec/integration/rails/app/controllers/application.rb +15 -0
  104. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  105. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  106. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  107. data/spec/integration/rails/app/controllers/webrat_controller.rb +43 -0
  108. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  109. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  110. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  111. data/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
  112. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  113. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  114. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  115. data/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
  116. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  117. data/spec/integration/rails/config/boot.rb +109 -0
  118. data/spec/integration/rails/config/environment.rb +12 -0
  119. data/spec/integration/rails/config/environments/development.rb +17 -0
  120. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  121. data/spec/integration/rails/config/environments/test.rb +22 -0
  122. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  123. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  124. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  125. data/spec/integration/rails/config/locales/en.yml +5 -0
  126. data/spec/integration/rails/config/routes.rb +18 -0
  127. data/spec/integration/rails/public/404.html +30 -0
  128. data/spec/integration/rails/public/422.html +30 -0
  129. data/spec/integration/rails/public/500.html +33 -0
  130. data/spec/integration/rails/script/about +4 -0
  131. data/spec/integration/rails/script/console +3 -0
  132. data/spec/integration/rails/script/dbconsole +3 -0
  133. data/spec/integration/rails/script/destroy +3 -0
  134. data/spec/integration/rails/script/generate +3 -0
  135. data/spec/integration/rails/script/performance/benchmarker +3 -0
  136. data/spec/integration/rails/script/performance/profiler +3 -0
  137. data/spec/integration/rails/script/performance/request +3 -0
  138. data/spec/integration/rails/script/plugin +3 -0
  139. data/spec/integration/rails/script/process/inspector +3 -0
  140. data/spec/integration/rails/script/process/reaper +3 -0
  141. data/spec/integration/rails/script/process/spawner +3 -0
  142. data/spec/integration/rails/script/runner +3 -0
  143. data/spec/integration/rails/script/server +3 -0
  144. data/spec/integration/rails/test/integration/button_click_test.rb +80 -0
  145. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  146. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  147. data/spec/integration/rails/test/integration/webrat_test.rb +97 -0
  148. data/spec/integration/rails/test/test_helper.rb +25 -0
  149. data/spec/integration/sinatra/Rakefile +5 -0
  150. data/spec/integration/sinatra/classic_app.rb +64 -0
  151. data/spec/integration/sinatra/modular_app.rb +16 -0
  152. data/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  153. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  154. data/spec/integration/sinatra/test/test_helper.rb +16 -0
  155. data/spec/private/core/configuration_spec.rb +116 -0
  156. data/spec/private/core/field_spec.rb +85 -0
  157. data/spec/private/core/link_spec.rb +24 -0
  158. data/spec/private/core/logging_spec.rb +10 -0
  159. data/spec/private/core/session_spec.rb +195 -0
  160. data/spec/private/mechanize/mechanize_session_spec.rb +81 -0
  161. data/spec/private/merb/attaches_file_spec.rb +93 -0
  162. data/spec/private/merb/merb_session_spec.rb +61 -0
  163. data/spec/private/nokogiri_spec.rb +77 -0
  164. data/spec/private/rails/attaches_file_spec.rb +81 -0
  165. data/spec/private/rails/rails_session_spec.rb +110 -0
  166. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  167. data/spec/public/basic_auth_spec.rb +24 -0
  168. data/spec/public/check_spec.rb +191 -0
  169. data/spec/public/choose_spec.rb +118 -0
  170. data/spec/public/click_area_spec.rb +106 -0
  171. data/spec/public/click_button_spec.rb +496 -0
  172. data/spec/public/click_link_spec.rb +511 -0
  173. data/spec/public/fill_in_spec.rb +209 -0
  174. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  175. data/spec/public/locators/field_labeled_spec.rb +172 -0
  176. data/spec/public/locators/field_with_id_spec.rb +16 -0
  177. data/spec/public/matchers/contain_spec.rb +114 -0
  178. data/spec/public/matchers/have_selector_spec.rb +142 -0
  179. data/spec/public/matchers/have_tag_spec.rb +39 -0
  180. data/spec/public/matchers/have_xpath_spec.rb +136 -0
  181. data/spec/public/reload_spec.rb +10 -0
  182. data/spec/public/save_and_open_spec.rb +70 -0
  183. data/spec/public/select_date_spec.rb +112 -0
  184. data/spec/public/select_datetime_spec.rb +137 -0
  185. data/spec/public/select_spec.rb +249 -0
  186. data/spec/public/select_time_spec.rb +100 -0
  187. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  188. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  189. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  190. data/spec/public/set_hidden_field_spec.rb +5 -0
  191. data/spec/public/submit_form_spec.rb +5 -0
  192. data/spec/public/visit_spec.rb +58 -0
  193. data/spec/public/within_spec.rb +177 -0
  194. data/spec/rcov.opts +1 -0
  195. data/spec/spec.opts +2 -0
  196. data/spec/spec_helper.rb +50 -0
  197. data/vendor/selenium-server.jar +0 -0
  198. data/webrat.gemspec +340 -0
  199. metadata +248 -33
  200. data/lib/webrat/selenium/application_server.rb +0 -71
  201. data/lib/webrat/selenium/merb_application_server.rb +0 -48
  202. data/lib/webrat/selenium/rails_application_server.rb +0 -42
  203. data/lib/webrat/selenium/sinatra_application_server.rb +0 -35
@@ -3,23 +3,23 @@ require "webrat/core/locators/locator"
3
3
 
4
4
  module Webrat
5
5
  module Locators
6
-
6
+
7
7
  class LabelLocator < Locator # :nodoc:
8
-
8
+
9
9
  def locate
10
10
  Label.load(@session, label_element)
11
11
  end
12
-
12
+
13
13
  def label_element
14
14
  label_elements.detect do |label_element|
15
- text(label_element) =~ /^\W*#{Regexp.escape(@value.to_s)}\b/i
15
+ text(label_element) =~ /^\W*#{Regexp.escape(@value.to_s)}(\b|\Z)/i
16
16
  end
17
17
  end
18
-
18
+
19
19
  def label_elements
20
20
  Webrat::XML.xpath_search(@dom, Label.xpath_search)
21
21
  end
22
-
22
+
23
23
  def text(label_element)
24
24
  str = Webrat::XML.all_inner_text(label_element)
25
25
  str.gsub!("\n","")
@@ -27,8 +27,8 @@ module Webrat
27
27
  str.squeeze!(" ")
28
28
  str
29
29
  end
30
-
30
+
31
31
  end
32
-
32
+
33
33
  end
34
- end
34
+ end
@@ -2,24 +2,24 @@ require "webrat/core/locators/locator"
2
2
 
3
3
  module Webrat
4
4
  module Locators
5
-
5
+
6
6
  class LinkLocator < Locator # :nodoc:
7
-
7
+
8
8
  def locate
9
9
  Link.load(@session, link_element)
10
10
  end
11
-
11
+
12
12
  def link_element
13
13
  matching_links.min { |a, b| Webrat::XML.all_inner_text(a).length <=> Webrat::XML.all_inner_text(b).length }
14
14
  end
15
-
15
+
16
16
  def matching_links
17
17
  @matching_links ||= link_elements.select do |link_element|
18
18
  matches_text?(link_element) ||
19
19
  matches_id?(link_element)
20
20
  end
21
21
  end
22
-
22
+
23
23
  def matches_text?(link)
24
24
  if @value.is_a?(Regexp)
25
25
  matcher = @value
@@ -39,28 +39,36 @@ module Webrat
39
39
  (Webrat::XML.attribute(link, "id") == @value) ? true : false
40
40
  end
41
41
  end
42
-
42
+
43
43
  def link_elements
44
44
  Webrat::XML.xpath_search(@dom, *Link.xpath_search)
45
45
  end
46
-
46
+
47
47
  def replace_nbsp(str)
48
- str.gsub([0xA0].pack('U'), ' ')
48
+ if str.respond_to?(:valid_encoding?)
49
+ if str.valid_encoding?
50
+ str.gsub(/\xc2\xa0/u, ' ')
51
+ else
52
+ str.force_encoding('UTF-8').gsub(/\xc2\xa0/u, ' ')
53
+ end
54
+ else
55
+ str.gsub(/\xc2\xa0/u, ' ')
56
+ end
49
57
  end
50
58
 
51
59
  def replace_nbsp_ref(str)
52
60
  str.gsub('&#xA0;',' ').gsub('&nbsp;', ' ')
53
61
  end
54
-
62
+
55
63
  def error_message
56
64
  "Could not find link with text or title or id #{@value.inspect}"
57
65
  end
58
-
66
+
59
67
  end
60
-
68
+
61
69
  def find_link(text_or_title_or_id) #:nodoc:
62
70
  LinkLocator.new(@session, dom, text_or_title_or_id).locate!
63
71
  end
64
-
72
+
65
73
  end
66
- end
74
+ end
@@ -1,6 +1,6 @@
1
1
  module Webrat
2
2
  module Locators
3
-
3
+
4
4
  class Locator # :nodoc:
5
5
 
6
6
  def initialize(session, dom, value, *field_types)
@@ -9,12 +9,12 @@ module Webrat
9
9
  @value = value
10
10
  @field_types = field_types
11
11
  end
12
-
12
+
13
13
  def locate!
14
14
  locate || raise(NotFoundError.new(error_message))
15
15
  end
16
-
16
+
17
17
  end
18
-
18
+
19
19
  end
20
- end
20
+ end
@@ -3,20 +3,20 @@ require "webrat/core/locators/locator"
3
3
 
4
4
  module Webrat
5
5
  module Locators
6
-
6
+
7
7
  class SelectOptionLocator < Locator # :nodoc:
8
-
8
+
9
9
  def initialize(session, dom, option_text, id_or_name_or_label)
10
10
  @session = session
11
11
  @dom = dom
12
12
  @option_text = option_text
13
13
  @id_or_name_or_label = id_or_name_or_label
14
14
  end
15
-
15
+
16
16
  def locate
17
17
  if @id_or_name_or_label
18
18
  field = FieldLocator.new(@session, @dom, @id_or_name_or_label, SelectField).locate!
19
-
19
+
20
20
  field.options.detect do |o|
21
21
  if @option_text.is_a?(Regexp)
22
22
  Webrat::XML.inner_html(o.element) =~ @option_text
@@ -32,15 +32,15 @@ module Webrat
32
32
  Webrat::XML.inner_html(o) == @option_text.to_s
33
33
  end
34
34
  end
35
-
35
+
36
36
  SelectOption.load(@session, option_element)
37
37
  end
38
38
  end
39
-
39
+
40
40
  def option_elements
41
41
  Webrat::XML.xpath_search(@dom, *SelectOption.xpath_search)
42
42
  end
43
-
43
+
44
44
  def error_message
45
45
  if @id_or_name_or_label
46
46
  "The '#{@option_text}' option was not found in the #{@id_or_name_or_label.inspect} select box"
@@ -48,12 +48,12 @@ module Webrat
48
48
  "Could not find option #{@option_text.inspect}"
49
49
  end
50
50
  end
51
-
51
+
52
52
  end
53
-
53
+
54
54
  def select_option(option_text, id_or_name_or_label = nil) #:nodoc:
55
55
  SelectOptionLocator.new(@session, dom, option_text, id_or_name_or_label).locate!
56
56
  end
57
-
57
+
58
58
  end
59
- end
59
+ end
@@ -1,6 +1,6 @@
1
1
  module Webrat
2
2
  module Logging #:nodoc:
3
-
3
+
4
4
  def debug_log(message) # :nodoc:
5
5
  return unless logger
6
6
  logger.debug message
@@ -13,9 +13,12 @@ module Webrat
13
13
  when :merb
14
14
  Merb.logger
15
15
  else
16
- nil
16
+ @logger ||= begin
17
+ require "logger"
18
+ ::Logger.new("webrat.log")
19
+ end
17
20
  end
18
21
  end
19
-
22
+
20
23
  end
21
- end
24
+ end
@@ -1,20 +1,20 @@
1
1
  module Webrat
2
2
  module Matchers
3
-
3
+
4
4
  class HasContent #:nodoc:
5
5
  def initialize(content)
6
6
  @content = content
7
7
  end
8
-
8
+
9
9
  def matches?(stringlike)
10
10
  if Webrat.configuration.parse_with_nokogiri?
11
11
  @document = Webrat.nokogiri_document(stringlike)
12
12
  else
13
13
  @document = Webrat.hpricot_document(stringlike)
14
14
  end
15
-
15
+
16
16
  @element = Webrat::XML.inner_text(@document)
17
-
17
+
18
18
  case @content
19
19
  when String
20
20
  @element.include?(@content)
@@ -22,7 +22,7 @@ module Webrat
22
22
  @element.match(@content)
23
23
  end
24
24
  end
25
-
25
+
26
26
  # ==== Returns
27
27
  # String:: The failure message.
28
28
  def failure_message
@@ -34,11 +34,11 @@ module Webrat
34
34
  def negative_failure_message
35
35
  "expected the following element's content to not #{content_message}:\n#{squeeze_space(@element)}"
36
36
  end
37
-
37
+
38
38
  def squeeze_space(inner_text)
39
39
  inner_text.gsub(/^\s*$/, "").squeeze("\n")
40
40
  end
41
-
41
+
42
42
  def content_message
43
43
  case @content
44
44
  when String
@@ -48,26 +48,26 @@ module Webrat
48
48
  end
49
49
  end
50
50
  end
51
-
51
+
52
52
  # Matches the contents of an HTML document with
53
53
  # whatever string is supplied
54
54
  def contain(content)
55
55
  HasContent.new(content)
56
56
  end
57
-
57
+
58
58
  # Asserts that the body of the response contain
59
59
  # the supplied string or regexp
60
60
  def assert_contain(content)
61
61
  hc = HasContent.new(content)
62
62
  assert hc.matches?(response_body), hc.failure_message
63
63
  end
64
-
64
+
65
65
  # Asserts that the body of the response
66
66
  # does not contain the supplied string or regepx
67
67
  def assert_not_contain(content)
68
68
  hc = HasContent.new(content)
69
69
  assert !hc.matches?(response_body), hc.negative_failure_message
70
70
  end
71
-
71
+
72
72
  end
73
- end
73
+ end
@@ -2,7 +2,7 @@ require "webrat/core/matchers/have_xpath"
2
2
 
3
3
  module Webrat
4
4
  module Matchers
5
-
5
+
6
6
  class HaveSelector < HaveXpath #:nodoc:
7
7
  # ==== Returns
8
8
  # String:: The failure message.
@@ -15,7 +15,7 @@ module Webrat
15
15
  def negative_failure_message
16
16
  "expected following output to omit a #{tag_inspect}:\n#{@document}"
17
17
  end
18
-
18
+
19
19
  def tag_inspect
20
20
  options = @options.dup
21
21
  count = options.delete(:count)
@@ -40,9 +40,9 @@ module Webrat
40
40
  ast.to_xpath
41
41
  end.first
42
42
  end
43
-
43
+
44
44
  end
45
-
45
+
46
46
  # Matches HTML content against a CSS 3 selector.
47
47
  #
48
48
  # ==== Parameters
@@ -54,21 +54,21 @@ module Webrat
54
54
  HaveSelector.new(name, attributes, &block)
55
55
  end
56
56
  alias_method :match_selector, :have_selector
57
-
58
-
57
+
58
+
59
59
  # Asserts that the body of the response contains
60
60
  # the supplied selector
61
61
  def assert_have_selector(name, attributes = {}, &block)
62
62
  matcher = HaveSelector.new(name, attributes, &block)
63
63
  assert matcher.matches?(response_body), matcher.failure_message
64
64
  end
65
-
65
+
66
66
  # Asserts that the body of the response
67
67
  # does not contain the supplied string or regepx
68
68
  def assert_have_no_selector(name, attributes = {}, &block)
69
69
  matcher = HaveSelector.new(name, attributes, &block)
70
70
  assert !matcher.matches?(response_body), matcher.negative_failure_message
71
71
  end
72
-
72
+
73
73
  end
74
- end
74
+ end
@@ -6,16 +6,16 @@ module Webrat
6
6
  def have_tag(*args, &block)
7
7
  have_selector(*args, &block)
8
8
  end
9
-
9
+
10
10
  alias_method :match_tag, :have_tag
11
-
11
+
12
12
  def assert_have_tag(*args, &block)
13
13
  assert_have_selector(*args, &block)
14
14
  end
15
-
15
+
16
16
  def assert_have_no_tag(*args, &block)
17
17
  assert_have_no_selector(*args, &block)
18
18
  end
19
19
 
20
20
  end
21
- end
21
+ end
@@ -3,25 +3,25 @@ require "webrat/core/xml/rexml"
3
3
 
4
4
  module Webrat
5
5
  module Matchers
6
-
6
+
7
7
  class HaveXpath #:nodoc:
8
8
  def initialize(expected, options = {}, &block)
9
9
  @expected = expected
10
10
  @options = options
11
11
  @block = block
12
12
  end
13
-
13
+
14
14
  def matches?(stringlike, &block)
15
15
  @block ||= block
16
16
  matched = matches(stringlike)
17
-
17
+
18
18
  if @options[:count]
19
19
  matched.size == @options[:count] && (!@block || @block.call(matched))
20
20
  else
21
21
  matched.any? && (!@block || @block.call(matched))
22
22
  end
23
23
  end
24
-
24
+
25
25
  def matches(stringlike)
26
26
  if Webrat.configuration.parse_with_nokogiri?
27
27
  nokogiri_matches(stringlike)
@@ -29,10 +29,10 @@ module Webrat
29
29
  rexml_matches(stringlike)
30
30
  end
31
31
  end
32
-
32
+
33
33
  def rexml_matches(stringlike)
34
34
  if REXML::Node === stringlike || Array === stringlike
35
- @query = query.map { |q| q.gsub(%r'//', './') }
35
+ @query = query.map { |q| q.gsub(%r'^//', './/') }
36
36
  else
37
37
  @query = query
38
38
  end
@@ -49,48 +49,48 @@ module Webrat
49
49
  end
50
50
  end.flatten.compact
51
51
  end
52
-
52
+
53
53
  def nokogiri_matches(stringlike)
54
54
  if Nokogiri::XML::NodeSet === stringlike
55
- @query = query.gsub(%r'//', './')
55
+ @query = query.gsub(%r'^//', './/')
56
56
  else
57
57
  @query = query
58
58
  end
59
-
59
+
60
60
  add_options_conditions_to(@query)
61
-
61
+
62
62
  @document = Webrat::XML.document(stringlike)
63
63
  @document.xpath(*@query)
64
64
  end
65
-
65
+
66
66
  def add_options_conditions_to(query)
67
67
  add_attributes_conditions_to(query)
68
68
  add_content_condition_to(query)
69
69
  end
70
-
70
+
71
71
  def add_attributes_conditions_to(query)
72
72
  attribute_conditions = []
73
-
73
+
74
74
  @options.each do |key, value|
75
75
  next if [:content, :count].include?(key)
76
76
  attribute_conditions << "@#{key} = #{xpath_escape(value)}"
77
77
  end
78
-
78
+
79
79
  if attribute_conditions.any?
80
80
  query << "[#{attribute_conditions.join(' and ')}]"
81
81
  end
82
82
  end
83
-
83
+
84
84
  def add_content_condition_to(query)
85
85
  if @options[:content]
86
86
  query << "[contains(., #{xpath_escape(@options[:content])})]"
87
87
  end
88
88
  end
89
-
89
+
90
90
  def query
91
91
  @expected
92
92
  end
93
-
93
+
94
94
  # ==== Returns
95
95
  # String:: The failure message.
96
96
  def failure_message
@@ -102,15 +102,15 @@ module Webrat
102
102
  def negative_failure_message
103
103
  "expected following text to not match xpath #{@expected}:\n#{@document}"
104
104
  end
105
-
105
+
106
106
  protected
107
-
107
+
108
108
  def xpath_escape(string)
109
109
  if string.include?("'") && string.include?('"')
110
110
  parts = string.split("'").map do |part|
111
111
  "'#{part}'"
112
112
  end
113
-
113
+
114
114
  "concat(" + parts.join(", \"'\", ") + ")"
115
115
  elsif string.include?("'")
116
116
  "\"#{string}\""
@@ -118,9 +118,9 @@ module Webrat
118
118
  "'#{string}'"
119
119
  end
120
120
  end
121
-
121
+
122
122
  end
123
-
123
+
124
124
  # Matches HTML content against an XPath query
125
125
  #
126
126
  # ==== Parameters
@@ -132,16 +132,16 @@ module Webrat
132
132
  HaveXpath.new(expected, options, &block)
133
133
  end
134
134
  alias_method :match_xpath, :have_xpath
135
-
135
+
136
136
  def assert_have_xpath(expected, options = {}, &block)
137
137
  hs = HaveXpath.new(expected, options, &block)
138
138
  assert hs.matches?(response_body), hs.failure_message
139
139
  end
140
-
140
+
141
141
  def assert_have_no_xpath(expected, options = {}, &block)
142
142
  hs = HaveXpath.new(expected, options, &block)
143
143
  assert !hs.matches?(response_body), hs.negative_failure_message
144
144
  end
145
-
145
+
146
146
  end
147
- end
147
+ end