mkuklis-webrat 0.5.1 → 0.6.rc1

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 (211) hide show
  1. data/.document +3 -3
  2. data/.gitignore +14 -14
  3. data/History.txt +413 -413
  4. data/MIT-LICENSE.txt +19 -19
  5. data/README.rdoc +84 -84
  6. data/Rakefile +187 -187
  7. data/VERSION +1 -1
  8. data/install.rb +1 -1
  9. data/lib/webrat/adapters/mechanize.rb +78 -78
  10. data/lib/webrat/adapters/merb.rb +11 -11
  11. data/lib/webrat/adapters/rack.rb +25 -25
  12. data/lib/webrat/adapters/rails.rb +81 -81
  13. data/lib/webrat/adapters/sinatra.rb +9 -9
  14. data/lib/webrat/core/configuration.rb +92 -92
  15. data/lib/webrat/core/elements/area.rb +31 -31
  16. data/lib/webrat/core/elements/element.rb +33 -33
  17. data/lib/webrat/core/elements/field.rb +487 -487
  18. data/lib/webrat/core/elements/form.rb +103 -103
  19. data/lib/webrat/core/elements/label.rb +31 -31
  20. data/lib/webrat/core/elements/link.rb +93 -93
  21. data/lib/webrat/core/elements/select_option.rb +48 -48
  22. data/lib/webrat/core/locators/area_locator.rb +38 -38
  23. data/lib/webrat/core/locators/button_locator.rb +54 -54
  24. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -37
  25. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -56
  26. data/lib/webrat/core/locators/field_locator.rb +25 -25
  27. data/lib/webrat/core/locators/field_named_locator.rb +41 -41
  28. data/lib/webrat/core/locators/form_locator.rb +19 -19
  29. data/lib/webrat/core/locators/label_locator.rb +34 -34
  30. data/lib/webrat/core/locators/link_locator.rb +74 -74
  31. data/lib/webrat/core/locators/locator.rb +20 -20
  32. data/lib/webrat/core/locators/select_option_locator.rb +59 -59
  33. data/lib/webrat/core/locators.rb +20 -20
  34. data/lib/webrat/core/logging.rb +23 -23
  35. data/lib/webrat/core/matchers/have_content.rb +68 -68
  36. data/lib/webrat/core/matchers/have_selector.rb +74 -74
  37. data/lib/webrat/core/matchers/have_tag.rb +21 -21
  38. data/lib/webrat/core/matchers/have_xpath.rb +122 -122
  39. data/lib/webrat/core/matchers.rb +4 -4
  40. data/lib/webrat/core/methods.rb +64 -64
  41. data/lib/webrat/core/mime.rb +18 -18
  42. data/lib/webrat/core/save_and_open_page.rb +48 -48
  43. data/lib/webrat/core/scope.rb +365 -365
  44. data/lib/webrat/core/session.rb +306 -306
  45. data/lib/webrat/core/xml.rb +72 -72
  46. data/lib/webrat/core.rb +13 -13
  47. data/lib/webrat/core_extensions/blank.rb +58 -58
  48. data/lib/webrat/core_extensions/deprecate.rb +8 -8
  49. data/lib/webrat/core_extensions/detect_mapped.rb +12 -12
  50. data/lib/webrat/core_extensions/meta_class.rb +6 -6
  51. data/lib/webrat/core_extensions/nil_to_param.rb +5 -5
  52. data/lib/webrat/core_extensions/tcp_socket.rb +27 -27
  53. data/lib/webrat/integrations/merb.rb +10 -10
  54. data/lib/webrat/integrations/rails.rb +25 -25
  55. data/lib/webrat/integrations/rspec-rails.rb +10 -10
  56. data/lib/webrat/integrations/selenium.rb +11 -11
  57. data/lib/webrat/merb.rb +9 -9
  58. data/lib/webrat/rspec-rails.rb +2 -2
  59. data/lib/webrat/selenium/application_server_factory.rb +40 -40
  60. data/lib/webrat/selenium/application_servers/external.rb +26 -26
  61. data/lib/webrat/selenium/application_servers/merb.rb +50 -50
  62. data/lib/webrat/selenium/application_servers/rails.rb +3 -6
  63. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -37
  64. data/lib/webrat/selenium/application_servers.rb +5 -5
  65. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -19
  66. data/lib/webrat/selenium/location_strategy_javascript/label.js +42 -42
  67. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -6
  68. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -32
  69. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -15
  70. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -5
  71. data/lib/webrat/selenium/matchers/have_content.rb +66 -66
  72. data/lib/webrat/selenium/matchers/have_selector.rb +49 -49
  73. data/lib/webrat/selenium/matchers/have_tag.rb +72 -72
  74. data/lib/webrat/selenium/matchers/have_xpath.rb +45 -45
  75. data/lib/webrat/selenium/matchers.rb +4 -4
  76. data/lib/webrat/selenium/selenium_extensions.js +5 -5
  77. data/lib/webrat/selenium/selenium_rc_server.rb +86 -86
  78. data/lib/webrat/selenium/selenium_session.rb +267 -272
  79. data/lib/webrat/selenium/silence_stream.rb +18 -18
  80. data/lib/webrat/selenium.rb +70 -70
  81. data/lib/webrat.rb +18 -18
  82. data/spec/fakes/test_adapter.rb +37 -37
  83. data/spec/integration/mechanize/Rakefile +6 -6
  84. data/spec/integration/mechanize/config.ru +1 -1
  85. data/spec/integration/mechanize/sample_app.rb +20 -20
  86. data/spec/integration/mechanize/spec/mechanize_spec.rb +22 -22
  87. data/spec/integration/mechanize/spec/spec_helper.rb +27 -27
  88. data/spec/integration/merb/.gitignore +20 -20
  89. data/spec/integration/merb/Rakefile +35 -35
  90. data/spec/integration/merb/app/controllers/application.rb +2 -2
  91. data/spec/integration/merb/app/controllers/exceptions.rb +13 -13
  92. data/spec/integration/merb/app/controllers/testing.rb +27 -27
  93. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -63
  94. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -47
  95. data/spec/integration/merb/app/views/layout/application.html.erb +11 -11
  96. data/spec/integration/merb/app/views/testing/show_form.html.erb +26 -26
  97. data/spec/integration/merb/app/views/testing/upload.html.erb +8 -8
  98. data/spec/integration/merb/config/environments/development.rb +15 -15
  99. data/spec/integration/merb/config/environments/rake.rb +11 -11
  100. data/spec/integration/merb/config/environments/test.rb +14 -14
  101. data/spec/integration/merb/config/init.rb +25 -25
  102. data/spec/integration/merb/config/rack.rb +11 -11
  103. data/spec/integration/merb/config/router.rb +34 -34
  104. data/spec/integration/merb/spec/spec.opts +1 -1
  105. data/spec/integration/merb/spec/spec_helper.rb +26 -26
  106. data/spec/integration/merb/spec/webrat_spec.rb +39 -39
  107. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -31
  108. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -64
  109. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -124
  110. data/spec/integration/merb/tasks/merb.thor/main.thor +149 -149
  111. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -93
  112. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -40
  113. data/spec/integration/rack/Rakefile +5 -5
  114. data/spec/integration/rack/app.rb +89 -89
  115. data/spec/integration/rack/test/helper.rb +21 -21
  116. data/spec/integration/rack/test/webrat_rack_test.rb +73 -73
  117. data/spec/integration/rails/.gitignore +3 -3
  118. data/spec/integration/rails/Rakefile +30 -30
  119. data/spec/integration/rails/app/controllers/application.rb +15 -15
  120. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -7
  121. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -4
  122. data/spec/integration/rails/app/controllers/links_controller.rb +7 -7
  123. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -46
  124. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -2
  125. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -2
  126. data/spec/integration/rails/app/helpers/links_helper.rb +2 -2
  127. data/spec/integration/rails/app/views/buttons/show.html.erb +10 -10
  128. data/spec/integration/rails/app/views/fields/show.html.erb +8 -8
  129. data/spec/integration/rails/app/views/links/show.html.erb +5 -5
  130. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +3 -3
  131. data/spec/integration/rails/app/views/webrat/buttons.html.erb +10 -10
  132. data/spec/integration/rails/app/views/webrat/form.html.erb +27 -27
  133. data/spec/integration/rails/app/views/webrat/within.html.erb +2 -2
  134. data/spec/integration/rails/config/boot.rb +109 -109
  135. data/spec/integration/rails/config/environment.rb +12 -12
  136. data/spec/integration/rails/config/environments/development.rb +17 -17
  137. data/spec/integration/rails/config/environments/selenium.rb +22 -22
  138. data/spec/integration/rails/config/environments/test.rb +22 -22
  139. data/spec/integration/rails/config/initializers/inflections.rb +10 -10
  140. data/spec/integration/rails/config/initializers/mime_types.rb +5 -5
  141. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -17
  142. data/spec/integration/rails/config/locales/en.yml +4 -4
  143. data/spec/integration/rails/config/routes.rb +19 -19
  144. data/spec/integration/rails/public/404.html +29 -29
  145. data/spec/integration/rails/public/422.html +29 -29
  146. data/spec/integration/rails/public/500.html +33 -33
  147. data/spec/integration/rails/script/about +3 -3
  148. data/spec/integration/rails/script/console +3 -3
  149. data/spec/integration/rails/script/dbconsole +3 -3
  150. data/spec/integration/rails/script/destroy +3 -3
  151. data/spec/integration/rails/script/generate +3 -3
  152. data/spec/integration/rails/script/performance/benchmarker +3 -3
  153. data/spec/integration/rails/script/performance/profiler +3 -3
  154. data/spec/integration/rails/script/performance/request +3 -3
  155. data/spec/integration/rails/script/plugin +3 -3
  156. data/spec/integration/rails/script/process/inspector +3 -3
  157. data/spec/integration/rails/script/process/reaper +3 -3
  158. data/spec/integration/rails/script/process/spawner +3 -3
  159. data/spec/integration/rails/script/runner +3 -3
  160. data/spec/integration/rails/script/server +3 -3
  161. data/spec/integration/rails/test/integration/button_click_test.rb +80 -80
  162. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -24
  163. data/spec/integration/rails/test/integration/link_click_test.rb +27 -27
  164. data/spec/integration/rails/test/integration/webrat_test.rb +122 -122
  165. data/spec/integration/rails/test/test_helper.rb +26 -26
  166. data/spec/integration/sinatra/Rakefile +5 -5
  167. data/spec/integration/sinatra/classic_app.rb +64 -64
  168. data/spec/integration/sinatra/modular_app.rb +16 -16
  169. data/spec/integration/sinatra/test/classic_app_test.rb +37 -37
  170. data/spec/integration/sinatra/test/modular_app_test.rb +18 -18
  171. data/spec/integration/sinatra/test/test_helper.rb +17 -17
  172. data/spec/private/core/configuration_spec.rb +87 -87
  173. data/spec/private/core/field_spec.rb +85 -85
  174. data/spec/private/core/link_spec.rb +24 -24
  175. data/spec/private/core/session_spec.rb +200 -200
  176. data/spec/private/mechanize/mechanize_adapter_spec.rb +73 -73
  177. data/spec/private/nokogiri_spec.rb +77 -77
  178. data/spec/private/rails/attaches_file_spec.rb +81 -81
  179. data/spec/private/rails/rails_adapter_spec.rb +86 -86
  180. data/spec/private/selenium/application_servers/rails_spec.rb +26 -26
  181. data/spec/public/basic_auth_spec.rb +24 -24
  182. data/spec/public/check_spec.rb +191 -191
  183. data/spec/public/choose_spec.rb +118 -118
  184. data/spec/public/click_area_spec.rb +106 -106
  185. data/spec/public/click_button_spec.rb +494 -494
  186. data/spec/public/click_link_spec.rb +511 -511
  187. data/spec/public/fill_in_spec.rb +224 -224
  188. data/spec/public/locators/field_by_xpath_spec.rb +19 -19
  189. data/spec/public/locators/field_labeled_spec.rb +172 -172
  190. data/spec/public/locators/field_with_id_spec.rb +16 -16
  191. data/spec/public/matchers/contain_spec.rb +114 -114
  192. data/spec/public/matchers/have_selector_spec.rb +146 -146
  193. data/spec/public/matchers/have_tag_spec.rb +39 -39
  194. data/spec/public/matchers/have_xpath_spec.rb +136 -136
  195. data/spec/public/reload_spec.rb +10 -10
  196. data/spec/public/save_and_open_spec.rb +70 -70
  197. data/spec/public/select_date_spec.rb +112 -112
  198. data/spec/public/select_datetime_spec.rb +137 -137
  199. data/spec/public/select_spec.rb +455 -455
  200. data/spec/public/select_time_spec.rb +100 -100
  201. data/spec/public/selenium/application_server_factory_spec.rb +49 -49
  202. data/spec/public/selenium/application_servers/external_spec.rb +12 -12
  203. data/spec/public/selenium/selenium_session_spec.rb +37 -37
  204. data/spec/public/set_hidden_field_spec.rb +5 -5
  205. data/spec/public/submit_form_spec.rb +5 -5
  206. data/spec/public/visit_spec.rb +58 -58
  207. data/spec/public/within_spec.rb +177 -177
  208. data/spec/spec.opts +1 -1
  209. data/spec/spec_helper.rb +54 -54
  210. data/webrat.gemspec +360 -0
  211. metadata +6 -5
@@ -1,74 +1,74 @@
1
- require "webrat/core/matchers/have_xpath"
2
-
3
- module Webrat
4
- module Matchers
5
-
6
- class HaveSelector < HaveXpath #:nodoc:
7
- # ==== Returns
8
- # String:: The failure message.
9
- def failure_message
10
- "expected following output to contain a #{tag_inspect} tag:\n#{@document}"
11
- end
12
-
13
- # ==== Returns
14
- # String:: The failure message to be displayed in negative matches.
15
- def negative_failure_message
16
- "expected following output to omit a #{tag_inspect}:\n#{@document}"
17
- end
18
-
19
- def tag_inspect
20
- options = @options.dup
21
- count = options.delete(:count)
22
- content = options.delete(:content)
23
-
24
- html = "<#{@expected}"
25
- options.each do |k,v|
26
- html << " #{k}='#{v}'"
27
- end
28
-
29
- if content
30
- html << ">#{content}</#{@expected}>"
31
- else
32
- html << "/>"
33
- end
34
-
35
- html
36
- end
37
-
38
- def query
39
- Nokogiri::CSS.parse(@expected.to_s).map do |ast|
40
- ast.to_xpath
41
- end.first
42
- end
43
-
44
- end
45
-
46
- # Matches HTML content against a CSS 3 selector.
47
- #
48
- # ==== Parameters
49
- # expected<String>:: The CSS selector to look for.
50
- #
51
- # ==== Returns
52
- # HaveSelector:: A new have selector matcher.
53
- def have_selector(name, attributes = {}, &block)
54
- HaveSelector.new(name, attributes, &block)
55
- end
56
- alias_method :match_selector, :have_selector
57
-
58
-
59
- # Asserts that the body of the response contains
60
- # the supplied selector
61
- def assert_have_selector(name, attributes = {}, &block)
62
- matcher = HaveSelector.new(name, attributes, &block)
63
- assert matcher.matches?(response_body), matcher.failure_message
64
- end
65
-
66
- # Asserts that the body of the response
67
- # does not contain the supplied string or regepx
68
- def assert_have_no_selector(name, attributes = {}, &block)
69
- matcher = HaveSelector.new(name, attributes, &block)
70
- assert !matcher.matches?(response_body), matcher.negative_failure_message
71
- end
72
-
73
- end
74
- end
1
+ require "webrat/core/matchers/have_xpath"
2
+
3
+ module Webrat
4
+ module Matchers
5
+
6
+ class HaveSelector < HaveXpath #:nodoc:
7
+ # ==== Returns
8
+ # String:: The failure message.
9
+ def failure_message
10
+ "expected following output to contain a #{tag_inspect} tag:\n#{@document}"
11
+ end
12
+
13
+ # ==== Returns
14
+ # String:: The failure message to be displayed in negative matches.
15
+ def negative_failure_message
16
+ "expected following output to omit a #{tag_inspect}:\n#{@document}"
17
+ end
18
+
19
+ def tag_inspect
20
+ options = @options.dup
21
+ count = options.delete(:count)
22
+ content = options.delete(:content)
23
+
24
+ html = "<#{@expected}"
25
+ options.each do |k,v|
26
+ html << " #{k}='#{v}'"
27
+ end
28
+
29
+ if content
30
+ html << ">#{content}</#{@expected}>"
31
+ else
32
+ html << "/>"
33
+ end
34
+
35
+ html
36
+ end
37
+
38
+ def query
39
+ Nokogiri::CSS.parse(@expected.to_s).map do |ast|
40
+ ast.to_xpath
41
+ end.first
42
+ end
43
+
44
+ end
45
+
46
+ # Matches HTML content against a CSS 3 selector.
47
+ #
48
+ # ==== Parameters
49
+ # expected<String>:: The CSS selector to look for.
50
+ #
51
+ # ==== Returns
52
+ # HaveSelector:: A new have selector matcher.
53
+ def have_selector(name, attributes = {}, &block)
54
+ HaveSelector.new(name, attributes, &block)
55
+ end
56
+ alias_method :match_selector, :have_selector
57
+
58
+
59
+ # Asserts that the body of the response contains
60
+ # the supplied selector
61
+ def assert_have_selector(name, attributes = {}, &block)
62
+ matcher = HaveSelector.new(name, attributes, &block)
63
+ assert matcher.matches?(response_body), matcher.failure_message
64
+ end
65
+
66
+ # Asserts that the body of the response
67
+ # does not contain the supplied string or regepx
68
+ def assert_have_no_selector(name, attributes = {}, &block)
69
+ matcher = HaveSelector.new(name, attributes, &block)
70
+ assert !matcher.matches?(response_body), matcher.negative_failure_message
71
+ end
72
+
73
+ end
74
+ end
@@ -1,21 +1,21 @@
1
- require "webrat/core/matchers/have_selector"
2
-
3
- module Webrat
4
- module HaveTagMatcher
5
-
6
- def have_tag(*args, &block)
7
- have_selector(*args, &block)
8
- end
9
-
10
- alias_method :match_tag, :have_tag
11
-
12
- def assert_have_tag(*args, &block)
13
- assert_have_selector(*args, &block)
14
- end
15
-
16
- def assert_have_no_tag(*args, &block)
17
- assert_have_no_selector(*args, &block)
18
- end
19
-
20
- end
21
- end
1
+ require "webrat/core/matchers/have_selector"
2
+
3
+ module Webrat
4
+ module HaveTagMatcher
5
+
6
+ def have_tag(*args, &block)
7
+ have_selector(*args, &block)
8
+ end
9
+
10
+ alias_method :match_tag, :have_tag
11
+
12
+ def assert_have_tag(*args, &block)
13
+ assert_have_selector(*args, &block)
14
+ end
15
+
16
+ def assert_have_no_tag(*args, &block)
17
+ assert_have_no_selector(*args, &block)
18
+ end
19
+
20
+ end
21
+ end
@@ -1,122 +1,122 @@
1
- require "webrat/core/xml"
2
-
3
- module Webrat
4
- module Matchers
5
-
6
- class HaveXpath #:nodoc:
7
- def initialize(expected, options = {}, &block)
8
- @expected = expected
9
- @options = options
10
- @block = block
11
- end
12
-
13
- def matches?(stringlike, &block)
14
- @block ||= block
15
- matched = matches(stringlike)
16
-
17
- if @options[:count]
18
- matched.size == @options[:count].to_i && (!@block || @block.call(matched))
19
- else
20
- matched.any? && (!@block || @block.call(matched))
21
- end
22
- end
23
-
24
- def matches(stringlike)
25
- nokogiri_matches(stringlike)
26
- end
27
-
28
- def nokogiri_matches(stringlike)
29
- if Nokogiri::XML::NodeSet === stringlike
30
- @query = query.gsub(%r'^//', './/')
31
- else
32
- @query = query
33
- end
34
-
35
- add_options_conditions_to(@query)
36
-
37
- @document = Webrat::XML.document(stringlike)
38
- @document.xpath(*@query)
39
- end
40
-
41
- def add_options_conditions_to(query)
42
- add_attributes_conditions_to(query)
43
- add_content_condition_to(query)
44
- end
45
-
46
- def add_attributes_conditions_to(query)
47
- attribute_conditions = []
48
-
49
- @options.each do |key, value|
50
- next if [:content, :count].include?(key)
51
- attribute_conditions << "@#{key} = #{xpath_escape(value)}"
52
- end
53
-
54
- if attribute_conditions.any?
55
- query << "[#{attribute_conditions.join(' and ')}]"
56
- end
57
- end
58
-
59
- def add_content_condition_to(query)
60
- if @options[:content]
61
- query << "[contains(., #{xpath_escape(@options[:content])})]"
62
- end
63
- end
64
-
65
- def query
66
- @expected
67
- end
68
-
69
- # ==== Returns
70
- # String:: The failure message.
71
- def failure_message
72
- "expected following text to match xpath #{@expected}:\n#{@document}"
73
- end
74
-
75
- # ==== Returns
76
- # String:: The failure message to be displayed in negative matches.
77
- def negative_failure_message
78
- "expected following text to not match xpath #{@expected}:\n#{@document}"
79
- end
80
-
81
- protected
82
-
83
- def xpath_escape(string)
84
- if string.include?("'") && string.include?('"')
85
- parts = string.split("'").map do |part|
86
- "'#{part}'"
87
- end
88
-
89
- "concat(" + parts.join(", \"'\", ") + ")"
90
- elsif string.include?("'")
91
- "\"#{string}\""
92
- else
93
- "'#{string}'"
94
- end
95
- end
96
-
97
- end
98
-
99
- # Matches HTML content against an XPath query
100
- #
101
- # ==== Parameters
102
- # expected<String>:: The XPath query to look for.
103
- #
104
- # ==== Returns
105
- # HaveXpath:: A new have xpath matcher.
106
- def have_xpath(expected, options = {}, &block)
107
- HaveXpath.new(expected, options, &block)
108
- end
109
- alias_method :match_xpath, :have_xpath
110
-
111
- def assert_have_xpath(expected, options = {}, &block)
112
- hs = HaveXpath.new(expected, options, &block)
113
- assert hs.matches?(response_body), hs.failure_message
114
- end
115
-
116
- def assert_have_no_xpath(expected, options = {}, &block)
117
- hs = HaveXpath.new(expected, options, &block)
118
- assert !hs.matches?(response_body), hs.negative_failure_message
119
- end
120
-
121
- end
122
- end
1
+ require "webrat/core/xml"
2
+
3
+ module Webrat
4
+ module Matchers
5
+
6
+ class HaveXpath #:nodoc:
7
+ def initialize(expected, options = {}, &block)
8
+ @expected = expected
9
+ @options = options
10
+ @block = block
11
+ end
12
+
13
+ def matches?(stringlike, &block)
14
+ @block ||= block
15
+ matched = matches(stringlike)
16
+
17
+ if @options[:count]
18
+ matched.size == @options[:count].to_i && (!@block || @block.call(matched))
19
+ else
20
+ matched.any? && (!@block || @block.call(matched))
21
+ end
22
+ end
23
+
24
+ def matches(stringlike)
25
+ nokogiri_matches(stringlike)
26
+ end
27
+
28
+ def nokogiri_matches(stringlike)
29
+ if Nokogiri::XML::NodeSet === stringlike
30
+ @query = query.gsub(%r'^//', './/')
31
+ else
32
+ @query = query
33
+ end
34
+
35
+ add_options_conditions_to(@query)
36
+
37
+ @document = Webrat::XML.document(stringlike)
38
+ @document.xpath(*@query)
39
+ end
40
+
41
+ def add_options_conditions_to(query)
42
+ add_attributes_conditions_to(query)
43
+ add_content_condition_to(query)
44
+ end
45
+
46
+ def add_attributes_conditions_to(query)
47
+ attribute_conditions = []
48
+
49
+ @options.each do |key, value|
50
+ next if [:content, :count].include?(key)
51
+ attribute_conditions << "@#{key} = #{xpath_escape(value)}"
52
+ end
53
+
54
+ if attribute_conditions.any?
55
+ query << "[#{attribute_conditions.join(' and ')}]"
56
+ end
57
+ end
58
+
59
+ def add_content_condition_to(query)
60
+ if @options[:content]
61
+ query << "[contains(., #{xpath_escape(@options[:content])})]"
62
+ end
63
+ end
64
+
65
+ def query
66
+ @expected
67
+ end
68
+
69
+ # ==== Returns
70
+ # String:: The failure message.
71
+ def failure_message
72
+ "expected following text to match xpath #{@expected}:\n#{@document}"
73
+ end
74
+
75
+ # ==== Returns
76
+ # String:: The failure message to be displayed in negative matches.
77
+ def negative_failure_message
78
+ "expected following text to not match xpath #{@expected}:\n#{@document}"
79
+ end
80
+
81
+ protected
82
+
83
+ def xpath_escape(string)
84
+ if string.include?("'") && string.include?('"')
85
+ parts = string.split("'").map do |part|
86
+ "'#{part}'"
87
+ end
88
+
89
+ "concat(" + parts.join(", \"'\", ") + ")"
90
+ elsif string.include?("'")
91
+ "\"#{string}\""
92
+ else
93
+ "'#{string}'"
94
+ end
95
+ end
96
+
97
+ end
98
+
99
+ # Matches HTML content against an XPath query
100
+ #
101
+ # ==== Parameters
102
+ # expected<String>:: The XPath query to look for.
103
+ #
104
+ # ==== Returns
105
+ # HaveXpath:: A new have xpath matcher.
106
+ def have_xpath(expected, options = {}, &block)
107
+ HaveXpath.new(expected, options, &block)
108
+ end
109
+ alias_method :match_xpath, :have_xpath
110
+
111
+ def assert_have_xpath(expected, options = {}, &block)
112
+ hs = HaveXpath.new(expected, options, &block)
113
+ assert hs.matches?(response_body), hs.failure_message
114
+ end
115
+
116
+ def assert_have_no_xpath(expected, options = {}, &block)
117
+ hs = HaveXpath.new(expected, options, &block)
118
+ assert !hs.matches?(response_body), hs.negative_failure_message
119
+ end
120
+
121
+ end
122
+ end
@@ -1,4 +1,4 @@
1
- require "webrat/core/matchers/have_xpath"
2
- require "webrat/core/matchers/have_selector"
3
- require "webrat/core/matchers/have_tag"
4
- require "webrat/core/matchers/have_content"
1
+ require "webrat/core/matchers/have_xpath"
2
+ require "webrat/core/matchers/have_selector"
3
+ require "webrat/core/matchers/have_tag"
4
+ require "webrat/core/matchers/have_content"
@@ -1,64 +1,64 @@
1
- module Webrat
2
- module Methods #:nodoc:
3
-
4
- def self.delegate_to_session(*meths)
5
- meths.each do |meth|
6
- self.class_eval <<-RUBY
7
- def #{meth}(*args, &blk)
8
- webrat_session.#{meth}(*args, &blk)
9
- end
10
- RUBY
11
- end
12
- end
13
-
14
- def webrat
15
- webrat_session
16
- end
17
-
18
- def webrat_session
19
- @_webrat_session ||= begin
20
- session = Webrat.session_class.new
21
- session.adapter = Webrat.adapter_class.new(self) if session.respond_to?(:adapter=)
22
- session
23
- end
24
- end
25
-
26
- # all of these methods delegate to the @session, which should
27
- # be created transparently.
28
- #
29
- # Note that when using Webrat, #request also uses @session, so
30
- # that #request and webrat native functions behave interchangably
31
-
32
- delegate_to_session \
33
- :visits, :visit,
34
- :within,
35
- :header, :http_accept, :basic_auth,
36
- :save_and_open_page,
37
- :fills_in, :fill_in,
38
- :checks, :check,
39
- :unchecks, :uncheck,
40
- :chooses, :choose,
41
- :selects, :select,
42
- :unselects, :unselect,
43
- :attaches_file, :attach_file,
44
- :current_page,
45
- :current_url,
46
- :clicks_link, :click_link,
47
- :clicks_area, :click_area,
48
- :clicks_button, :click_button,
49
- :reload, :reloads,
50
- :clicks_link_within, :click_link_within,
51
- :field_labeled,
52
- :select_option,
53
- :set_hidden_field, :submit_form,
54
- :request_page, :current_dom,
55
- :response_body,
56
- :selects_date, :selects_time, :selects_datetime,
57
- :select_date, :select_time, :select_datetime,
58
- :field_by_xpath,
59
- :field_with_id,
60
- :selenium,
61
- :simulate, :automate,
62
- :field_named
63
- end
64
- end
1
+ module Webrat
2
+ module Methods #:nodoc:
3
+
4
+ def self.delegate_to_session(*meths)
5
+ meths.each do |meth|
6
+ self.class_eval <<-RUBY
7
+ def #{meth}(*args, &blk)
8
+ webrat_session.#{meth}(*args, &blk)
9
+ end
10
+ RUBY
11
+ end
12
+ end
13
+
14
+ def webrat
15
+ webrat_session
16
+ end
17
+
18
+ def webrat_session
19
+ @_webrat_session ||= begin
20
+ session = Webrat.session_class.new
21
+ session.adapter = Webrat.adapter_class.new(self) if session.respond_to?(:adapter=)
22
+ session
23
+ end
24
+ end
25
+
26
+ # all of these methods delegate to the @session, which should
27
+ # be created transparently.
28
+ #
29
+ # Note that when using Webrat, #request also uses @session, so
30
+ # that #request and webrat native functions behave interchangably
31
+
32
+ delegate_to_session \
33
+ :visits, :visit,
34
+ :within,
35
+ :header, :http_accept, :basic_auth,
36
+ :save_and_open_page,
37
+ :fills_in, :fill_in,
38
+ :checks, :check,
39
+ :unchecks, :uncheck,
40
+ :chooses, :choose,
41
+ :selects, :select,
42
+ :unselects, :unselect,
43
+ :attaches_file, :attach_file,
44
+ :current_page,
45
+ :current_url,
46
+ :clicks_link, :click_link,
47
+ :clicks_area, :click_area,
48
+ :clicks_button, :click_button,
49
+ :reload, :reloads,
50
+ :clicks_link_within, :click_link_within,
51
+ :field_labeled,
52
+ :select_option,
53
+ :set_hidden_field, :submit_form,
54
+ :request_page, :current_dom,
55
+ :response_body,
56
+ :selects_date, :selects_time, :selects_datetime,
57
+ :select_date, :select_time, :select_datetime,
58
+ :field_by_xpath,
59
+ :field_with_id,
60
+ :selenium,
61
+ :simulate, :automate,
62
+ :field_named
63
+ end
64
+ end
@@ -1,18 +1,18 @@
1
- module Webrat #:nodoc:
2
- module MIME #:nodoc:
3
- MIME_TYPES = Rack::Mime::MIME_TYPES.dup.merge(
4
- ".multipart_form" => "multipart/form-data",
5
- ".url_encoded_form" => "application/x-www-form-urlencoded"
6
- ).freeze
7
-
8
- def mime_type(type)
9
- return type if type.nil? || type.to_s.include?("/")
10
- type = ".#{type}" unless type.to_s[0] == ?.
11
- MIME_TYPES.fetch(type) { |type|
12
- raise ArgumentError.new("Invalid Mime type: #{type}")
13
- }
14
- end
15
-
16
- module_function :mime_type
17
- end
18
- end
1
+ module Webrat #:nodoc:
2
+ module MIME #:nodoc:
3
+ MIME_TYPES = Rack::Mime::MIME_TYPES.dup.merge(
4
+ ".multipart_form" => "multipart/form-data",
5
+ ".url_encoded_form" => "application/x-www-form-urlencoded"
6
+ ).freeze
7
+
8
+ def mime_type(type)
9
+ return type if type.nil? || type.to_s.include?("/")
10
+ type = ".#{type}" unless type.to_s[0] == ?.
11
+ MIME_TYPES.fetch(type) { |type|
12
+ raise ArgumentError.new("Invalid Mime type: #{type}")
13
+ }
14
+ end
15
+
16
+ module_function :mime_type
17
+ end
18
+ end