thoughtbot-webrat 0.7.2.pre

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 (215) hide show
  1. data/.document +4 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +13 -0
  4. data/History.txt +450 -0
  5. data/MIT-LICENSE.txt +19 -0
  6. data/README.rdoc +85 -0
  7. data/Rakefile +143 -0
  8. data/Thorfile +118 -0
  9. data/install.rb +1 -0
  10. data/lib/webrat.rb +18 -0
  11. data/lib/webrat/adapters/mechanize.rb +94 -0
  12. data/lib/webrat/adapters/merb.rb +11 -0
  13. data/lib/webrat/adapters/rack.rb +29 -0
  14. data/lib/webrat/adapters/rails.rb +77 -0
  15. data/lib/webrat/adapters/sinatra.rb +9 -0
  16. data/lib/webrat/core.rb +13 -0
  17. data/lib/webrat/core/configuration.rb +114 -0
  18. data/lib/webrat/core/elements/area.rb +31 -0
  19. data/lib/webrat/core/elements/element.rb +33 -0
  20. data/lib/webrat/core/elements/field.rb +438 -0
  21. data/lib/webrat/core/elements/form.rb +127 -0
  22. data/lib/webrat/core/elements/label.rb +31 -0
  23. data/lib/webrat/core/elements/link.rb +93 -0
  24. data/lib/webrat/core/elements/select_option.rb +48 -0
  25. data/lib/webrat/core/locators.rb +20 -0
  26. data/lib/webrat/core/locators/area_locator.rb +38 -0
  27. data/lib/webrat/core/locators/button_locator.rb +54 -0
  28. data/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  29. data/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  30. data/lib/webrat/core/locators/field_locator.rb +25 -0
  31. data/lib/webrat/core/locators/field_named_locator.rb +41 -0
  32. data/lib/webrat/core/locators/form_locator.rb +19 -0
  33. data/lib/webrat/core/locators/label_locator.rb +34 -0
  34. data/lib/webrat/core/locators/link_locator.rb +74 -0
  35. data/lib/webrat/core/locators/locator.rb +20 -0
  36. data/lib/webrat/core/locators/select_option_locator.rb +59 -0
  37. data/lib/webrat/core/logging.rb +23 -0
  38. data/lib/webrat/core/matchers.rb +4 -0
  39. data/lib/webrat/core/matchers/have_content.rb +68 -0
  40. data/lib/webrat/core/matchers/have_selector.rb +74 -0
  41. data/lib/webrat/core/matchers/have_tag.rb +21 -0
  42. data/lib/webrat/core/matchers/have_xpath.rb +125 -0
  43. data/lib/webrat/core/methods.rb +64 -0
  44. data/lib/webrat/core/mime.rb +18 -0
  45. data/lib/webrat/core/save_and_open_page.rb +28 -0
  46. data/lib/webrat/core/scope.rb +366 -0
  47. data/lib/webrat/core/session.rb +303 -0
  48. data/lib/webrat/core/xml.rb +72 -0
  49. data/lib/webrat/core_extensions/blank.rb +58 -0
  50. data/lib/webrat/core_extensions/deprecate.rb +8 -0
  51. data/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  52. data/lib/webrat/core_extensions/meta_class.rb +6 -0
  53. data/lib/webrat/core_extensions/nil_to_query_string.rb +5 -0
  54. data/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  55. data/lib/webrat/integrations/merb.rb +10 -0
  56. data/lib/webrat/integrations/rails.rb +25 -0
  57. data/lib/webrat/integrations/rspec-rails.rb +11 -0
  58. data/lib/webrat/integrations/selenium.rb +11 -0
  59. data/lib/webrat/merb.rb +9 -0
  60. data/lib/webrat/rspec-rails.rb +2 -0
  61. data/lib/webrat/selenium.rb +70 -0
  62. data/lib/webrat/selenium/application_server_factory.rb +40 -0
  63. data/lib/webrat/selenium/application_servers.rb +5 -0
  64. data/lib/webrat/selenium/application_servers/base.rb +46 -0
  65. data/lib/webrat/selenium/application_servers/external.rb +26 -0
  66. data/lib/webrat/selenium/application_servers/merb.rb +50 -0
  67. data/lib/webrat/selenium/application_servers/rails.rb +44 -0
  68. data/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  69. data/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  70. data/lib/webrat/selenium/location_strategy_javascript/label.js +48 -0
  71. data/lib/webrat/selenium/location_strategy_javascript/webrat.js +6 -0
  72. data/lib/webrat/selenium/location_strategy_javascript/webratlink.js +32 -0
  73. data/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  74. data/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  75. data/lib/webrat/selenium/matchers.rb +4 -0
  76. data/lib/webrat/selenium/matchers/have_content.rb +78 -0
  77. data/lib/webrat/selenium/matchers/have_selector.rb +57 -0
  78. data/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  79. data/lib/webrat/selenium/matchers/have_xpath.rb +53 -0
  80. data/lib/webrat/selenium/selenium_extensions.js +6 -0
  81. data/lib/webrat/selenium/selenium_rc_server.rb +89 -0
  82. data/lib/webrat/selenium/selenium_session.rb +272 -0
  83. data/lib/webrat/selenium/silence_stream.rb +18 -0
  84. data/spec/fakes/test_adapter.rb +33 -0
  85. data/spec/integration/mechanize/Rakefile +7 -0
  86. data/spec/integration/mechanize/config.ru +2 -0
  87. data/spec/integration/mechanize/sample_app.rb +35 -0
  88. data/spec/integration/mechanize/spec/mechanize_spec.rb +30 -0
  89. data/spec/integration/mechanize/spec/spec_helper.rb +29 -0
  90. data/spec/integration/merb/.gitignore +21 -0
  91. data/spec/integration/merb/Rakefile +35 -0
  92. data/spec/integration/merb/app/controllers/application.rb +2 -0
  93. data/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  94. data/spec/integration/merb/app/controllers/testing.rb +27 -0
  95. data/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  96. data/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  97. data/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  98. data/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  99. data/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  100. data/spec/integration/merb/config/environments/development.rb +15 -0
  101. data/spec/integration/merb/config/environments/rake.rb +11 -0
  102. data/spec/integration/merb/config/environments/test.rb +14 -0
  103. data/spec/integration/merb/config/init.rb +25 -0
  104. data/spec/integration/merb/config/rack.rb +11 -0
  105. data/spec/integration/merb/config/router.rb +34 -0
  106. data/spec/integration/merb/spec/spec.opts +1 -0
  107. data/spec/integration/merb/spec/spec_helper.rb +26 -0
  108. data/spec/integration/merb/spec/webrat_spec.rb +39 -0
  109. data/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  110. data/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  111. data/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  112. data/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  113. data/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  114. data/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  115. data/spec/integration/rack/Rakefile +5 -0
  116. data/spec/integration/rack/app.rb +89 -0
  117. data/spec/integration/rack/test/helper.rb +20 -0
  118. data/spec/integration/rack/test/webrat_rack_test.rb +74 -0
  119. data/spec/integration/rails/.gitignore +3 -0
  120. data/spec/integration/rails/Rakefile +30 -0
  121. data/spec/integration/rails/app/controllers/application_controller.rb +15 -0
  122. data/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  123. data/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  124. data/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  125. data/spec/integration/rails/app/controllers/webrat_controller.rb +46 -0
  126. data/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  127. data/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  128. data/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  129. data/spec/integration/rails/app/views/buttons/show.html.erb +9 -0
  130. data/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  131. data/spec/integration/rails/app/views/links/show.html.erb +5 -0
  132. data/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  133. data/spec/integration/rails/app/views/webrat/buttons.html.erb +9 -0
  134. data/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  135. data/spec/integration/rails/app/views/webrat/within.html.erb +3 -0
  136. data/spec/integration/rails/config/boot.rb +109 -0
  137. data/spec/integration/rails/config/environment.rb +12 -0
  138. data/spec/integration/rails/config/environments/development.rb +17 -0
  139. data/spec/integration/rails/config/environments/selenium.rb +22 -0
  140. data/spec/integration/rails/config/environments/test.rb +22 -0
  141. data/spec/integration/rails/config/initializers/inflections.rb +10 -0
  142. data/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  143. data/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  144. data/spec/integration/rails/config/locales/en.yml +5 -0
  145. data/spec/integration/rails/config/routes.rb +19 -0
  146. data/spec/integration/rails/public/404.html +30 -0
  147. data/spec/integration/rails/public/422.html +30 -0
  148. data/spec/integration/rails/public/500.html +33 -0
  149. data/spec/integration/rails/script/about +4 -0
  150. data/spec/integration/rails/script/console +3 -0
  151. data/spec/integration/rails/script/dbconsole +3 -0
  152. data/spec/integration/rails/script/destroy +3 -0
  153. data/spec/integration/rails/script/generate +3 -0
  154. data/spec/integration/rails/script/performance/benchmarker +3 -0
  155. data/spec/integration/rails/script/performance/profiler +3 -0
  156. data/spec/integration/rails/script/performance/request +3 -0
  157. data/spec/integration/rails/script/plugin +3 -0
  158. data/spec/integration/rails/script/process/inspector +3 -0
  159. data/spec/integration/rails/script/process/reaper +3 -0
  160. data/spec/integration/rails/script/process/spawner +3 -0
  161. data/spec/integration/rails/script/runner +3 -0
  162. data/spec/integration/rails/script/server +3 -0
  163. data/spec/integration/rails/test/integration/button_click_test.rb +66 -0
  164. data/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  165. data/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  166. data/spec/integration/rails/test/integration/webrat_test.rb +123 -0
  167. data/spec/integration/rails/test/test_helper.rb +27 -0
  168. data/spec/integration/sinatra/Rakefile +5 -0
  169. data/spec/integration/sinatra/classic_app.rb +63 -0
  170. data/spec/integration/sinatra/modular_app.rb +15 -0
  171. data/spec/integration/sinatra/test/classic_app_test.rb +38 -0
  172. data/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  173. data/spec/integration/sinatra/test/test_helper.rb +16 -0
  174. data/spec/private/core/configuration_spec.rb +87 -0
  175. data/spec/private/core/field_spec.rb +83 -0
  176. data/spec/private/core/form_spec.rb +51 -0
  177. data/spec/private/core/link_spec.rb +24 -0
  178. data/spec/private/core/session_spec.rb +182 -0
  179. data/spec/private/mechanize/mechanize_adapter_spec.rb +96 -0
  180. data/spec/private/nokogiri_spec.rb +77 -0
  181. data/spec/private/rails/attaches_file_spec.rb +114 -0
  182. data/spec/private/rails/rails_adapter_spec.rb +79 -0
  183. data/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  184. data/spec/public/basic_auth_spec.rb +35 -0
  185. data/spec/public/check_spec.rb +191 -0
  186. data/spec/public/choose_spec.rb +118 -0
  187. data/spec/public/click_area_spec.rb +106 -0
  188. data/spec/public/click_button_spec.rb +494 -0
  189. data/spec/public/click_link_spec.rb +532 -0
  190. data/spec/public/fill_in_spec.rb +224 -0
  191. data/spec/public/locators/field_by_xpath_spec.rb +19 -0
  192. data/spec/public/locators/field_labeled_spec.rb +172 -0
  193. data/spec/public/locators/field_with_id_spec.rb +16 -0
  194. data/spec/public/matchers/contain_spec.rb +133 -0
  195. data/spec/public/matchers/have_selector_spec.rb +146 -0
  196. data/spec/public/matchers/have_tag_spec.rb +39 -0
  197. data/spec/public/matchers/have_xpath_spec.rb +154 -0
  198. data/spec/public/reload_spec.rb +10 -0
  199. data/spec/public/save_and_open_spec.rb +49 -0
  200. data/spec/public/select_date_spec.rb +112 -0
  201. data/spec/public/select_datetime_spec.rb +137 -0
  202. data/spec/public/select_spec.rb +474 -0
  203. data/spec/public/select_time_spec.rb +100 -0
  204. data/spec/public/selenium/application_server_factory_spec.rb +49 -0
  205. data/spec/public/selenium/application_servers/external_spec.rb +12 -0
  206. data/spec/public/selenium/selenium_session_spec.rb +37 -0
  207. data/spec/public/set_hidden_field_spec.rb +5 -0
  208. data/spec/public/submit_form_spec.rb +56 -0
  209. data/spec/public/visit_spec.rb +58 -0
  210. data/spec/public/within_spec.rb +177 -0
  211. data/spec/rcov.opts +1 -0
  212. data/spec/spec.opts +2 -0
  213. data/spec/spec_helper.rb +53 -0
  214. data/vendor/selenium-server.jar +0 -0
  215. metadata +424 -0
@@ -0,0 +1,56 @@
1
+ require "webrat/core_extensions/detect_mapped"
2
+ require "webrat/core/locators/locator"
3
+
4
+ module Webrat
5
+ module Locators
6
+
7
+ class FieldLabeledLocator < Locator # :nodoc:
8
+
9
+ def locate
10
+ matching_labels.any? && matching_labels.detect_mapped { |label| label.field }
11
+ end
12
+
13
+ def matching_labels
14
+ matching_label_elements.sort_by do |label_element|
15
+ text(label_element).length
16
+ end.map do |label_element|
17
+ Label.load(@session, label_element)
18
+ end
19
+ end
20
+
21
+ def matching_label_elements
22
+ label_elements.select do |label_element|
23
+ text(label_element) =~ /^\W*#{Regexp.escape(@value.to_s)}(\b|\Z)/i
24
+ end
25
+ end
26
+
27
+ def label_elements
28
+ @dom.xpath(*Label.xpath_search)
29
+ end
30
+
31
+ def error_message
32
+ "Could not find field labeled #{@value.inspect}"
33
+ end
34
+
35
+ def text(element)
36
+ str = element.inner_text
37
+ str.gsub!("\n","")
38
+ str.strip!
39
+ str.squeeze!(" ")
40
+ str
41
+ end
42
+
43
+ end
44
+
45
+ # Locates a form field based on a <tt>label</tt> element in the HTML source.
46
+ # This can be useful in order to verify that a field is pre-filled with the
47
+ # correct value.
48
+ #
49
+ # Example:
50
+ # field_labeled("First name").value.should == "Bryan"
51
+ def field_labeled(label, *field_types)
52
+ FieldLabeledLocator.new(@session, dom, label, *field_types).locate!
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,25 @@
1
+ require "webrat/core/locators/locator"
2
+
3
+ module Webrat
4
+ module Locators
5
+
6
+ class FieldLocator < Locator # :nodoc:
7
+
8
+ def locate
9
+ FieldByIdLocator.new(@session, @dom, @value).locate ||
10
+ FieldNamedLocator.new(@session, @dom, @value, *@field_types).locate ||
11
+ FieldLabeledLocator.new(@session, @dom, @value, *@field_types).locate
12
+ end
13
+
14
+ def error_message
15
+ "Could not find field: #{@value.inspect}"
16
+ end
17
+
18
+ end
19
+
20
+ def field(*args) # :nodoc:
21
+ FieldLocator.new(@session, dom, *args).locate!
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ require "webrat/core/locators/locator"
2
+
3
+ module Webrat
4
+ module Locators
5
+
6
+ class FieldNamedLocator < Locator # :nodoc:
7
+
8
+ def locate
9
+ Field.load(@session, field_element)
10
+ end
11
+
12
+ def field_element
13
+ field_elements.detect do |field_element|
14
+ field_element["name"] == @value.to_s
15
+ end
16
+ end
17
+
18
+ def field_elements
19
+ @dom.xpath(*xpath_searches)
20
+ end
21
+
22
+ def xpath_searches
23
+ if @field_types.any?
24
+ @field_types.map { |field_type| field_type.xpath_search }.flatten
25
+ else
26
+ Field.xpath_search
27
+ end
28
+ end
29
+
30
+ def error_message
31
+ "Could not find field named #{@value.inspect}"
32
+ end
33
+
34
+ end
35
+
36
+ def field_named(name, *field_types)
37
+ FieldNamedLocator.new(@session, dom, name, *field_types).locate!
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,19 @@
1
+ require "webrat/core/locators/locator"
2
+
3
+ module Webrat
4
+ module Locators
5
+
6
+ class FormLocator < Locator # :nodoc:
7
+
8
+ def locate
9
+ Form.load(@session, form_element)
10
+ end
11
+
12
+ def form_element
13
+ @dom.css("#" + @value).first || @dom.css(@value).first
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,34 @@
1
+ require "webrat/core_extensions/detect_mapped"
2
+ require "webrat/core/locators/locator"
3
+
4
+ module Webrat
5
+ module Locators
6
+
7
+ class LabelLocator < Locator # :nodoc:
8
+
9
+ def locate
10
+ Label.load(@session, label_element)
11
+ end
12
+
13
+ def label_element
14
+ label_elements.detect do |label_element|
15
+ text(label_element) =~ /^\W*#{Regexp.escape(@value.to_s)}(\b|\Z)/i
16
+ end
17
+ end
18
+
19
+ def label_elements
20
+ @dom.xpath(*Label.xpath_search)
21
+ end
22
+
23
+ def text(label_element)
24
+ str = label_element.inner_text
25
+ str.gsub!("\n","")
26
+ str.strip!
27
+ str.squeeze!(" ")
28
+ str
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,74 @@
1
+ require "webrat/core/locators/locator"
2
+
3
+ module Webrat
4
+ module Locators
5
+
6
+ class LinkLocator < Locator # :nodoc:
7
+
8
+ def locate
9
+ Link.load(@session, link_element)
10
+ end
11
+
12
+ def link_element
13
+ matching_links.min { |a, b| a.inner_text.length <=> b.inner_text.length }
14
+ end
15
+
16
+ def matching_links
17
+ @matching_links ||= link_elements.select do |link_element|
18
+ matches_text?(link_element) ||
19
+ matches_id?(link_element)
20
+ end
21
+ end
22
+
23
+ def matches_text?(link)
24
+ if @value.is_a?(Regexp)
25
+ matcher = @value
26
+ else
27
+ matcher = /#{Regexp.escape(@value.to_s)}/i
28
+ end
29
+
30
+ replace_nbsp(link.inner_text) =~ matcher ||
31
+ replace_nbsp_ref(link.inner_html) =~ matcher ||
32
+ link["title"] =~ matcher
33
+ end
34
+
35
+ def matches_id?(link)
36
+ if @value.is_a?(Regexp)
37
+ link["id"] =~ @value ? true : false
38
+ else
39
+ link["id"] == @value ? true : false
40
+ end
41
+ end
42
+
43
+ def link_elements
44
+ @dom.xpath(*Link.xpath_search)
45
+ end
46
+
47
+ def replace_nbsp(str)
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
57
+ end
58
+
59
+ def replace_nbsp_ref(str)
60
+ str.gsub('&#xA0;',' ').gsub('&nbsp;', ' ')
61
+ end
62
+
63
+ def error_message
64
+ "Could not find link with text or title or id #{@value.inspect}"
65
+ end
66
+
67
+ end
68
+
69
+ def find_link(text_or_title_or_id) #:nodoc:
70
+ LinkLocator.new(@session, dom, text_or_title_or_id).locate!
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,20 @@
1
+ module Webrat
2
+ module Locators
3
+
4
+ class Locator # :nodoc:
5
+
6
+ def initialize(session, dom, value, *field_types)
7
+ @session = session
8
+ @dom = dom
9
+ @value = value
10
+ @field_types = field_types
11
+ end
12
+
13
+ def locate!
14
+ locate || raise(NotFoundError.new(error_message))
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,59 @@
1
+ require "webrat/core_extensions/detect_mapped"
2
+ require "webrat/core/locators/locator"
3
+
4
+ module Webrat
5
+ module Locators
6
+
7
+ class SelectOptionLocator < Locator # :nodoc:
8
+
9
+ def initialize(session, dom, option_text, id_or_name_or_label)
10
+ @session = session
11
+ @dom = dom
12
+ @option_text = option_text
13
+ @id_or_name_or_label = id_or_name_or_label
14
+ end
15
+
16
+ def locate
17
+ if @id_or_name_or_label
18
+ field = FieldLocator.new(@session, @dom, @id_or_name_or_label, SelectField, MultipleSelectField).locate!
19
+
20
+ field.options.detect do |o|
21
+ if @option_text.is_a?(Regexp)
22
+ o.element.inner_text =~ @option_text
23
+ else
24
+ o.inner_text == @option_text.to_s
25
+ end
26
+ end
27
+ else
28
+ option_element = option_elements.detect do |o|
29
+ if @option_text.is_a?(Regexp)
30
+ o.inner_text =~ @option_text
31
+ else
32
+ o.inner_text == @option_text.to_s
33
+ end
34
+ end
35
+
36
+ SelectOption.load(@session, option_element)
37
+ end
38
+ end
39
+
40
+ def option_elements
41
+ @dom.xpath(*SelectOption.xpath_search)
42
+ end
43
+
44
+ def error_message
45
+ if @id_or_name_or_label
46
+ "The '#{@option_text}' option was not found in the #{@id_or_name_or_label.inspect} select box"
47
+ else
48
+ "Could not find option #{@option_text.inspect}"
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ def select_option(option_text, id_or_name_or_label = nil) #:nodoc:
55
+ SelectOptionLocator.new(@session, dom, option_text, id_or_name_or_label).locate!
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,23 @@
1
+ require "logger"
2
+
3
+ module Webrat
4
+ module Logging #:nodoc:
5
+
6
+ def debug_log(message) # :nodoc:
7
+ return unless logger
8
+ logger.debug message
9
+ end
10
+
11
+ def logger # :nodoc:
12
+ case Webrat.configuration.mode
13
+ when :rails
14
+ defined?(RAILS_DEFAULT_LOGGER) ? RAILS_DEFAULT_LOGGER : nil
15
+ when :merb
16
+ ::Merb.logger
17
+ else
18
+ @logger ||= ::Logger.new("webrat.log")
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +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"
@@ -0,0 +1,68 @@
1
+ module Webrat
2
+ module Matchers
3
+
4
+ class HasContent #:nodoc:
5
+ def initialize(content)
6
+ @content = content
7
+ end
8
+
9
+ def matches?(stringlike)
10
+ @document = Webrat::XML.document(stringlike).xpath('//html')
11
+ @element = @document.inner_text
12
+
13
+ case @content
14
+ when String
15
+ @element.gsub(/\s+/, ' ').include?(@content)
16
+ when Regexp
17
+ @element.match(@content)
18
+ end
19
+ end
20
+
21
+ # ==== Returns
22
+ # String:: The failure message.
23
+ def failure_message
24
+ "expected the following element's content to #{content_message}:\n#{squeeze_space(@element)}"
25
+ end
26
+
27
+ # ==== Returns
28
+ # String:: The failure message to be displayed in negative matches.
29
+ def negative_failure_message
30
+ "expected the following element's content to not #{content_message}:\n#{squeeze_space(@element)}"
31
+ end
32
+
33
+ def squeeze_space(inner_text)
34
+ inner_text.gsub(/^\s*$/, "").squeeze("\n")
35
+ end
36
+
37
+ def content_message
38
+ case @content
39
+ when String
40
+ "include \"#{@content}\""
41
+ when Regexp
42
+ "match #{@content.inspect}"
43
+ end
44
+ end
45
+ end
46
+
47
+ # Matches the contents of an HTML document with
48
+ # whatever string is supplied
49
+ def contain(content)
50
+ HasContent.new(content)
51
+ end
52
+
53
+ # Asserts that the body of the response contain
54
+ # the supplied string or regexp
55
+ def assert_contain(content)
56
+ hc = HasContent.new(content)
57
+ assert hc.matches?(response_body), hc.failure_message
58
+ end
59
+
60
+ # Asserts that the body of the response
61
+ # does not contain the supplied string or regepx
62
+ def assert_not_contain(content)
63
+ hc = HasContent.new(content)
64
+ assert !hc.matches?(response_body), hc.negative_failure_message
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +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