sum 0.1.1

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 (282) hide show
  1. data/Capfile +3 -0
  2. data/MIT-LICENSE +18 -0
  3. data/README.markdown +69 -0
  4. data/Rakefile +56 -0
  5. data/config.ru +3 -0
  6. data/config/database.example.yml +10 -0
  7. data/config/deploy.example.rb +36 -0
  8. data/config/externals.yml +18 -0
  9. data/config/mail.example.yml +32 -0
  10. data/config/schedule.rb +20 -0
  11. data/db/migrate/001_users.rb +22 -0
  12. data/db/migrate/002_user_emails.rb +15 -0
  13. data/features/front_page.feature +15 -0
  14. data/features/read_email.feature +445 -0
  15. data/features/receive_email.feature +59 -0
  16. data/features/step_definitions/email.rb +52 -0
  17. data/features/step_definitions/given.rb +60 -0
  18. data/features/step_definitions/then.rb +36 -0
  19. data/features/step_definitions/when.rb +46 -0
  20. data/features/support/env.rb +38 -0
  21. data/features/support/helpers.rb +50 -0
  22. data/features/support/rspec.rb +11 -0
  23. data/features/support/webrat.rb +3 -0
  24. data/features/update_user.feature +83 -0
  25. data/gemspec.rb +45 -0
  26. data/lib/sum.rb +30 -0
  27. data/lib/sum/boot.rb +29 -0
  28. data/lib/sum/controller/cron.rb +12 -0
  29. data/lib/sum/controller/front.rb +6 -0
  30. data/lib/sum/controller/new.rb +15 -0
  31. data/lib/sum/helper/application.rb +8 -0
  32. data/lib/sum/helper/cron.rb +12 -0
  33. data/lib/sum/helper/new.rb +27 -0
  34. data/lib/sum/model/incoming_mail.rb +89 -0
  35. data/lib/sum/model/user.rb +298 -0
  36. data/lib/sum/model/user_email.rb +31 -0
  37. data/lib/sum/view/email.haml +70 -0
  38. data/lib/sum/view/field.haml +23 -0
  39. data/lib/sum/view/form.haml +13 -0
  40. data/lib/sum/view/front.haml +29 -0
  41. data/lib/sum/view/layout.haml +26 -0
  42. data/lib/sum/view/new.haml +5 -0
  43. data/lib/sum/view/success.haml +14 -0
  44. data/lib/sum/view/tos.haml +3 -0
  45. data/public/image/1.png +0 -0
  46. data/public/image/2.png +0 -0
  47. data/public/image/3.png +0 -0
  48. data/public/image/bg.png +0 -0
  49. data/public/image/bot.png +0 -0
  50. data/public/image/facebox/b.png +0 -0
  51. data/public/image/facebox/bl.png +0 -0
  52. data/public/image/facebox/br.png +0 -0
  53. data/public/image/facebox/closelabel.gif +0 -0
  54. data/public/image/facebox/loading.gif +0 -0
  55. data/public/image/facebox/tl.png +0 -0
  56. data/public/image/facebox/tr.png +0 -0
  57. data/public/image/favicon.png +0 -0
  58. data/public/image/field_off.png +0 -0
  59. data/public/image/field_on.png +0 -0
  60. data/public/image/ribbon.png +0 -0
  61. data/public/image/screenshot_receive.png +0 -0
  62. data/public/image/screenshot_send.png +0 -0
  63. data/public/image/submit.png +0 -0
  64. data/public/image/top.png +0 -0
  65. data/public/javascript/facebox.js +319 -0
  66. data/public/javascript/jquery-1.3.2.js +19 -0
  67. data/public/javascript/sum.js +13 -0
  68. data/public/style/facebox.css +95 -0
  69. data/public/style/ie.css +35 -0
  70. data/public/style/print.css +30 -0
  71. data/public/style/screen.css +256 -0
  72. data/public/style/sum.css +119 -0
  73. data/public/style/sum.less +159 -0
  74. data/spec/spec.opts +1 -0
  75. data/spec/spec_helper.rb +59 -0
  76. data/spec/sum/model/incoming_mail_spec.rb +106 -0
  77. data/spec/sum/model/user_spec.rb +172 -0
  78. data/sum.gemspec +69 -0
  79. data/vendor/webrat/History.txt +358 -0
  80. data/vendor/webrat/MIT-LICENSE.txt +19 -0
  81. data/vendor/webrat/README.rdoc +85 -0
  82. data/vendor/webrat/Rakefile +200 -0
  83. data/vendor/webrat/install.rb +1 -0
  84. data/vendor/webrat/lib/webrat.rb +31 -0
  85. data/vendor/webrat/lib/webrat/core.rb +14 -0
  86. data/vendor/webrat/lib/webrat/core/configuration.rb +102 -0
  87. data/vendor/webrat/lib/webrat/core/elements/area.rb +31 -0
  88. data/vendor/webrat/lib/webrat/core/elements/element.rb +33 -0
  89. data/vendor/webrat/lib/webrat/core/elements/field.rb +409 -0
  90. data/vendor/webrat/lib/webrat/core/elements/form.rb +103 -0
  91. data/vendor/webrat/lib/webrat/core/elements/label.rb +31 -0
  92. data/vendor/webrat/lib/webrat/core/elements/link.rb +93 -0
  93. data/vendor/webrat/lib/webrat/core/elements/select_option.rb +35 -0
  94. data/vendor/webrat/lib/webrat/core/locators.rb +20 -0
  95. data/vendor/webrat/lib/webrat/core/locators/area_locator.rb +38 -0
  96. data/vendor/webrat/lib/webrat/core/locators/button_locator.rb +54 -0
  97. data/vendor/webrat/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  98. data/vendor/webrat/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  99. data/vendor/webrat/lib/webrat/core/locators/field_locator.rb +25 -0
  100. data/vendor/webrat/lib/webrat/core/locators/field_named_locator.rb +41 -0
  101. data/vendor/webrat/lib/webrat/core/locators/form_locator.rb +19 -0
  102. data/vendor/webrat/lib/webrat/core/locators/label_locator.rb +34 -0
  103. data/vendor/webrat/lib/webrat/core/locators/link_locator.rb +74 -0
  104. data/vendor/webrat/lib/webrat/core/locators/locator.rb +20 -0
  105. data/vendor/webrat/lib/webrat/core/locators/select_option_locator.rb +59 -0
  106. data/vendor/webrat/lib/webrat/core/logging.rb +24 -0
  107. data/vendor/webrat/lib/webrat/core/matchers.rb +4 -0
  108. data/vendor/webrat/lib/webrat/core/matchers/have_content.rb +73 -0
  109. data/vendor/webrat/lib/webrat/core/matchers/have_selector.rb +74 -0
  110. data/vendor/webrat/lib/webrat/core/matchers/have_tag.rb +21 -0
  111. data/vendor/webrat/lib/webrat/core/matchers/have_xpath.rb +147 -0
  112. data/vendor/webrat/lib/webrat/core/methods.rb +63 -0
  113. data/vendor/webrat/lib/webrat/core/mime.rb +29 -0
  114. data/vendor/webrat/lib/webrat/core/save_and_open_page.rb +48 -0
  115. data/vendor/webrat/lib/webrat/core/scope.rb +350 -0
  116. data/vendor/webrat/lib/webrat/core/session.rb +299 -0
  117. data/vendor/webrat/lib/webrat/core/xml.rb +115 -0
  118. data/vendor/webrat/lib/webrat/core/xml/hpricot.rb +19 -0
  119. data/vendor/webrat/lib/webrat/core/xml/nokogiri.rb +76 -0
  120. data/vendor/webrat/lib/webrat/core/xml/rexml.rb +24 -0
  121. data/vendor/webrat/lib/webrat/core_extensions/blank.rb +58 -0
  122. data/vendor/webrat/lib/webrat/core_extensions/deprecate.rb +8 -0
  123. data/vendor/webrat/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  124. data/vendor/webrat/lib/webrat/core_extensions/meta_class.rb +6 -0
  125. data/vendor/webrat/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  126. data/vendor/webrat/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  127. data/vendor/webrat/lib/webrat/mechanize.rb +74 -0
  128. data/vendor/webrat/lib/webrat/merb.rb +9 -0
  129. data/vendor/webrat/lib/webrat/merb_multipart_support.rb +27 -0
  130. data/vendor/webrat/lib/webrat/merb_session.rb +82 -0
  131. data/vendor/webrat/lib/webrat/rack.rb +25 -0
  132. data/vendor/webrat/lib/webrat/rails.rb +106 -0
  133. data/vendor/webrat/lib/webrat/rspec-rails.rb +10 -0
  134. data/vendor/webrat/lib/webrat/selenium.rb +81 -0
  135. data/vendor/webrat/lib/webrat/selenium/application_server_factory.rb +40 -0
  136. data/vendor/webrat/lib/webrat/selenium/application_servers.rb +5 -0
  137. data/vendor/webrat/lib/webrat/selenium/application_servers/base.rb +46 -0
  138. data/vendor/webrat/lib/webrat/selenium/application_servers/external.rb +26 -0
  139. data/vendor/webrat/lib/webrat/selenium/application_servers/merb.rb +50 -0
  140. data/vendor/webrat/lib/webrat/selenium/application_servers/rails.rb +44 -0
  141. data/vendor/webrat/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  142. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  143. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
  144. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
  145. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratlink.js +12 -0
  146. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  147. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  148. data/vendor/webrat/lib/webrat/selenium/matchers.rb +4 -0
  149. data/vendor/webrat/lib/webrat/selenium/matchers/have_content.rb +66 -0
  150. data/vendor/webrat/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  151. data/vendor/webrat/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  152. data/vendor/webrat/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  153. data/vendor/webrat/lib/webrat/selenium/selenium_extensions.js +6 -0
  154. data/vendor/webrat/lib/webrat/selenium/selenium_rc_server.rb +84 -0
  155. data/vendor/webrat/lib/webrat/selenium/selenium_session.rb +248 -0
  156. data/vendor/webrat/lib/webrat/selenium/silence_stream.rb +18 -0
  157. data/vendor/webrat/lib/webrat/sinatra.rb +11 -0
  158. data/vendor/webrat/spec/fakes/test_session.rb +34 -0
  159. data/vendor/webrat/spec/integration/merb/Rakefile +35 -0
  160. data/vendor/webrat/spec/integration/merb/app/controllers/application.rb +2 -0
  161. data/vendor/webrat/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  162. data/vendor/webrat/spec/integration/merb/app/controllers/testing.rb +27 -0
  163. data/vendor/webrat/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  164. data/vendor/webrat/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  165. data/vendor/webrat/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  166. data/vendor/webrat/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  167. data/vendor/webrat/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  168. data/vendor/webrat/spec/integration/merb/config/environments/development.rb +15 -0
  169. data/vendor/webrat/spec/integration/merb/config/environments/rake.rb +11 -0
  170. data/vendor/webrat/spec/integration/merb/config/environments/test.rb +14 -0
  171. data/vendor/webrat/spec/integration/merb/config/init.rb +25 -0
  172. data/vendor/webrat/spec/integration/merb/config/rack.rb +11 -0
  173. data/vendor/webrat/spec/integration/merb/config/router.rb +34 -0
  174. data/vendor/webrat/spec/integration/merb/spec/spec.opts +1 -0
  175. data/vendor/webrat/spec/integration/merb/spec/spec_helper.rb +24 -0
  176. data/vendor/webrat/spec/integration/merb/spec/webrat_spec.rb +39 -0
  177. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  178. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  179. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  180. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  181. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  182. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  183. data/vendor/webrat/spec/integration/rack/Rakefile +5 -0
  184. data/vendor/webrat/spec/integration/rack/app.rb +73 -0
  185. data/vendor/webrat/spec/integration/rack/test/helper.rb +20 -0
  186. data/vendor/webrat/spec/integration/rack/test/webrat_rack_test.rb +62 -0
  187. data/vendor/webrat/spec/integration/rails/Rakefile +30 -0
  188. data/vendor/webrat/spec/integration/rails/app/controllers/application.rb +15 -0
  189. data/vendor/webrat/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  190. data/vendor/webrat/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  191. data/vendor/webrat/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  192. data/vendor/webrat/spec/integration/rails/app/controllers/webrat_controller.rb +43 -0
  193. data/vendor/webrat/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  194. data/vendor/webrat/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  195. data/vendor/webrat/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  196. data/vendor/webrat/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
  197. data/vendor/webrat/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  198. data/vendor/webrat/spec/integration/rails/app/views/links/show.html.erb +5 -0
  199. data/vendor/webrat/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  200. data/vendor/webrat/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
  201. data/vendor/webrat/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  202. data/vendor/webrat/spec/integration/rails/config/boot.rb +109 -0
  203. data/vendor/webrat/spec/integration/rails/config/environment.rb +12 -0
  204. data/vendor/webrat/spec/integration/rails/config/environments/development.rb +17 -0
  205. data/vendor/webrat/spec/integration/rails/config/environments/selenium.rb +22 -0
  206. data/vendor/webrat/spec/integration/rails/config/environments/test.rb +22 -0
  207. data/vendor/webrat/spec/integration/rails/config/initializers/inflections.rb +10 -0
  208. data/vendor/webrat/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  209. data/vendor/webrat/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  210. data/vendor/webrat/spec/integration/rails/config/locales/en.yml +5 -0
  211. data/vendor/webrat/spec/integration/rails/config/routes.rb +18 -0
  212. data/vendor/webrat/spec/integration/rails/public/404.html +30 -0
  213. data/vendor/webrat/spec/integration/rails/public/422.html +30 -0
  214. data/vendor/webrat/spec/integration/rails/public/500.html +33 -0
  215. data/vendor/webrat/spec/integration/rails/script/about +4 -0
  216. data/vendor/webrat/spec/integration/rails/script/console +3 -0
  217. data/vendor/webrat/spec/integration/rails/script/dbconsole +3 -0
  218. data/vendor/webrat/spec/integration/rails/script/destroy +3 -0
  219. data/vendor/webrat/spec/integration/rails/script/generate +3 -0
  220. data/vendor/webrat/spec/integration/rails/script/performance/benchmarker +3 -0
  221. data/vendor/webrat/spec/integration/rails/script/performance/profiler +3 -0
  222. data/vendor/webrat/spec/integration/rails/script/performance/request +3 -0
  223. data/vendor/webrat/spec/integration/rails/script/plugin +3 -0
  224. data/vendor/webrat/spec/integration/rails/script/process/inspector +3 -0
  225. data/vendor/webrat/spec/integration/rails/script/process/reaper +3 -0
  226. data/vendor/webrat/spec/integration/rails/script/process/spawner +3 -0
  227. data/vendor/webrat/spec/integration/rails/script/runner +3 -0
  228. data/vendor/webrat/spec/integration/rails/script/server +3 -0
  229. data/vendor/webrat/spec/integration/rails/test/integration/button_click_test.rb +80 -0
  230. data/vendor/webrat/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  231. data/vendor/webrat/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  232. data/vendor/webrat/spec/integration/rails/test/integration/webrat_test.rb +97 -0
  233. data/vendor/webrat/spec/integration/rails/test/test_helper.rb +25 -0
  234. data/vendor/webrat/spec/integration/sinatra/Rakefile +5 -0
  235. data/vendor/webrat/spec/integration/sinatra/classic_app.rb +64 -0
  236. data/vendor/webrat/spec/integration/sinatra/modular_app.rb +16 -0
  237. data/vendor/webrat/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  238. data/vendor/webrat/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  239. data/vendor/webrat/spec/integration/sinatra/test/test_helper.rb +16 -0
  240. data/vendor/webrat/spec/private/core/configuration_spec.rb +116 -0
  241. data/vendor/webrat/spec/private/core/field_spec.rb +85 -0
  242. data/vendor/webrat/spec/private/core/link_spec.rb +24 -0
  243. data/vendor/webrat/spec/private/core/logging_spec.rb +10 -0
  244. data/vendor/webrat/spec/private/core/session_spec.rb +195 -0
  245. data/vendor/webrat/spec/private/mechanize/mechanize_session_spec.rb +81 -0
  246. data/vendor/webrat/spec/private/merb/attaches_file_spec.rb +93 -0
  247. data/vendor/webrat/spec/private/merb/merb_session_spec.rb +61 -0
  248. data/vendor/webrat/spec/private/nokogiri_spec.rb +77 -0
  249. data/vendor/webrat/spec/private/rails/attaches_file_spec.rb +81 -0
  250. data/vendor/webrat/spec/private/rails/rails_session_spec.rb +112 -0
  251. data/vendor/webrat/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  252. data/vendor/webrat/spec/public/basic_auth_spec.rb +24 -0
  253. data/vendor/webrat/spec/public/check_spec.rb +191 -0
  254. data/vendor/webrat/spec/public/choose_spec.rb +118 -0
  255. data/vendor/webrat/spec/public/click_area_spec.rb +106 -0
  256. data/vendor/webrat/spec/public/click_button_spec.rb +496 -0
  257. data/vendor/webrat/spec/public/click_link_spec.rb +511 -0
  258. data/vendor/webrat/spec/public/fill_in_spec.rb +209 -0
  259. data/vendor/webrat/spec/public/locators/field_by_xpath_spec.rb +19 -0
  260. data/vendor/webrat/spec/public/locators/field_labeled_spec.rb +172 -0
  261. data/vendor/webrat/spec/public/locators/field_with_id_spec.rb +16 -0
  262. data/vendor/webrat/spec/public/matchers/contain_spec.rb +114 -0
  263. data/vendor/webrat/spec/public/matchers/have_selector_spec.rb +142 -0
  264. data/vendor/webrat/spec/public/matchers/have_tag_spec.rb +39 -0
  265. data/vendor/webrat/spec/public/matchers/have_xpath_spec.rb +136 -0
  266. data/vendor/webrat/spec/public/reload_spec.rb +10 -0
  267. data/vendor/webrat/spec/public/save_and_open_spec.rb +70 -0
  268. data/vendor/webrat/spec/public/select_date_spec.rb +112 -0
  269. data/vendor/webrat/spec/public/select_datetime_spec.rb +137 -0
  270. data/vendor/webrat/spec/public/select_spec.rb +249 -0
  271. data/vendor/webrat/spec/public/select_time_spec.rb +100 -0
  272. data/vendor/webrat/spec/public/selenium/application_server_factory_spec.rb +49 -0
  273. data/vendor/webrat/spec/public/selenium/application_servers/external_spec.rb +12 -0
  274. data/vendor/webrat/spec/public/selenium/selenium_session_spec.rb +37 -0
  275. data/vendor/webrat/spec/public/set_hidden_field_spec.rb +5 -0
  276. data/vendor/webrat/spec/public/submit_form_spec.rb +5 -0
  277. data/vendor/webrat/spec/public/visit_spec.rb +58 -0
  278. data/vendor/webrat/spec/public/within_spec.rb +177 -0
  279. data/vendor/webrat/spec/rcov.opts +1 -0
  280. data/vendor/webrat/spec/spec.opts +2 -0
  281. data/vendor/webrat/spec/spec_helper.rb +50 -0
  282. metadata +474 -0
@@ -0,0 +1,299 @@
1
+ require "forwardable"
2
+ require "ostruct"
3
+
4
+ require "webrat/core/mime"
5
+ require "webrat/core/save_and_open_page"
6
+
7
+ module Webrat
8
+ # A page load or form submission returned an unsuccessful response code (500-599)
9
+ class PageLoadError < WebratError
10
+ end
11
+
12
+ class InfiniteRedirectError < WebratError
13
+ end
14
+
15
+ def self.session_class
16
+ case Webrat.configuration.mode
17
+ when :rails
18
+ RailsSession
19
+ when :merb
20
+ MerbSession
21
+ when :rack
22
+ RackSession
23
+ when :rack_test
24
+ warn("The :rack_test mode is deprecated. Please use :rack instead")
25
+ require "webrat/rack"
26
+ RackSession
27
+ when :sinatra
28
+ warn("The :sinatra mode is deprecated. Please use :rack instead")
29
+ SinatraSession
30
+ when :selenium
31
+ SeleniumSession
32
+ when :sinatra
33
+ SinatraSession
34
+ when :mechanize
35
+ MechanizeSession
36
+ else
37
+ raise WebratError.new(<<-STR)
38
+ Unknown Webrat mode: #{Webrat.configuration.mode.inspect}
39
+
40
+ Please ensure you have a Webrat configuration block that specifies a mode
41
+ in your test_helper.rb, spec_helper.rb, or env.rb (for Cucumber).
42
+
43
+ This configure block supercedes the need to require "webrat/<framework>".
44
+
45
+ For example:
46
+
47
+ Webrat.configure do |config|
48
+ config.mode = :rails
49
+ end
50
+ STR
51
+ end
52
+ end
53
+
54
+ class Session
55
+ extend Forwardable
56
+ include Logging
57
+ include SaveAndOpenPage
58
+ attr_reader :current_url
59
+ attr_reader :elements
60
+
61
+ def_delegators :@adapter, :response, :response_code, :response_body,
62
+ :response_body=, :response_code=,
63
+ :get, :post, :put, :delete
64
+
65
+ def initialize(adapter=nil)
66
+ @http_method = :get
67
+ @data = {}
68
+ @default_headers = {}
69
+ @custom_headers = {}
70
+ @adapter = adapter
71
+
72
+ reset
73
+ end
74
+
75
+ def current_dom #:nodoc:
76
+ current_scope.dom
77
+ end
78
+
79
+ # For backwards compatibility -- removing in 1.0
80
+ def current_page #:nodoc:
81
+ warn "current_page is deprecated and will be going away in the next release. Use current_url instead."
82
+ page = OpenStruct.new
83
+ page.url = @current_url
84
+ page.http_method = @http_method
85
+ page.data = @data
86
+ page
87
+ end
88
+
89
+ def doc_root #:nodoc:
90
+ nil
91
+ end
92
+
93
+ def header(key, value)
94
+ @custom_headers[key] = value
95
+ end
96
+
97
+ def http_accept(mime_type)
98
+ header('Accept', Webrat::MIME.mime_type(mime_type))
99
+ end
100
+
101
+ def basic_auth(user, pass)
102
+ encoded_login = ["#{user}:#{pass}"].pack("m*")
103
+ header('HTTP_AUTHORIZATION', "Basic #{encoded_login}")
104
+ end
105
+
106
+ def headers #:nodoc:
107
+ @default_headers.dup.merge(@custom_headers.dup)
108
+ end
109
+
110
+ def request_page(url, http_method, data) #:nodoc:
111
+ h = headers
112
+ h['HTTP_REFERER'] = @current_url if @current_url
113
+
114
+ debug_log "REQUESTING PAGE: #{http_method.to_s.upcase} #{url} with #{data.inspect} and HTTP headers #{h.inspect}"
115
+
116
+ process_request(http_method, url, data, h)
117
+
118
+ save_and_open_page if exception_caught? && Webrat.configuration.open_error_files?
119
+ raise PageLoadError.new("Page load was not successful (Code: #{response_code.inspect}):\n#{formatted_error}") unless success_code?
120
+
121
+ reset
122
+
123
+ @current_url = url
124
+ @http_method = http_method
125
+ @data = data
126
+
127
+ if internal_redirect?
128
+ check_for_infinite_redirects
129
+ request_page(response_location, :get, {})
130
+ end
131
+
132
+ return response
133
+ end
134
+
135
+ def check_for_infinite_redirects
136
+ if current_url == response_location
137
+ @_identical_redirect_count ||= 0
138
+ @_identical_redirect_count += 1
139
+ end
140
+
141
+ if infinite_redirect_limit_exceeded?
142
+ raise InfiniteRedirectError.new("#{Webrat.configuration.infinite_redirect_limit} redirects to the same URL (#{current_url.inspect})")
143
+ end
144
+ end
145
+
146
+ def infinite_redirect_limit_exceeded?
147
+ Webrat.configuration.infinite_redirect_limit &&
148
+ (@_identical_redirect_count || 0) > Webrat.configuration.infinite_redirect_limit
149
+ end
150
+
151
+ def success_code? #:nodoc:
152
+ (200..499).include?(response_code)
153
+ end
154
+
155
+ def redirect? #:nodoc:
156
+ (response_code / 100).to_i == 3
157
+ end
158
+
159
+ def internal_redirect?
160
+ return false unless redirect?
161
+ #should keep internal_redirects if the subdomain changes
162
+ current_host_domain = current_host.split('.')[-2..-1].join('.') rescue current_host
163
+ response_location_host_domain = response_location_host.split('.')[-2..-1].join('.') rescue response_location_host
164
+ current_host_domain == response_location_host_domain
165
+ end
166
+
167
+ #easy helper to pull out where we were redirected to
168
+ def redirected_to
169
+ redirect? ? response_location : nil
170
+ end
171
+
172
+ def exception_caught? #:nodoc:
173
+ response_body =~ /Exception caught/
174
+ end
175
+
176
+ def current_scope #:nodoc:
177
+ scopes.last || page_scope
178
+ end
179
+
180
+ # Reloads the last page requested. Note that this will resubmit forms
181
+ # and their data.
182
+ def reload
183
+ request_page(@current_url, @http_method, @data)
184
+ end
185
+
186
+ webrat_deprecate :reloads, :reload
187
+
188
+
189
+ # Works like click_link, but only looks for the link text within a given selector
190
+ #
191
+ # Example:
192
+ # click_link_within "#user_12", "Vote"
193
+ def click_link_within(selector, link_text)
194
+ within(selector) do
195
+ click_link(link_text)
196
+ end
197
+ end
198
+
199
+ webrat_deprecate :clicks_link_within, :click_link_within
200
+
201
+ def within(selector)
202
+ scopes.push(Scope.from_scope(self, current_scope, selector))
203
+ ret = yield(current_scope)
204
+ scopes.pop
205
+ return ret
206
+ end
207
+
208
+ # Issues a GET request for a page, follows any redirects, and verifies the final page
209
+ # load was successful.
210
+ #
211
+ # Example:
212
+ # visit "/"
213
+ def visit(url = nil, http_method = :get, data = {})
214
+ request_page(url, http_method, data)
215
+ end
216
+
217
+ webrat_deprecate :visits, :visit
218
+
219
+ # Subclasses can override this to show error messages without html
220
+ def formatted_error #:nodoc:
221
+ response_body
222
+ end
223
+
224
+ def scopes #:nodoc:
225
+ @_scopes ||= []
226
+ end
227
+
228
+ def page_scope #:nodoc:
229
+ @_page_scope ||= Scope.from_page(self, response, response_body)
230
+ end
231
+
232
+ def dom
233
+ page_scope.dom
234
+ end
235
+
236
+ def xml_content_type?
237
+ false
238
+ end
239
+
240
+ def simulate
241
+ return if Webrat.configuration.mode == :selenium
242
+ yield
243
+ end
244
+
245
+ def automate
246
+ return unless Webrat.configuration.mode == :selenium
247
+ yield
248
+ end
249
+
250
+ def_delegators :current_scope, :fill_in, :fills_in
251
+ def_delegators :current_scope, :set_hidden_field
252
+ def_delegators :current_scope, :submit_form
253
+ def_delegators :current_scope, :check, :checks
254
+ def_delegators :current_scope, :uncheck, :unchecks
255
+ def_delegators :current_scope, :choose, :chooses
256
+ def_delegators :current_scope, :select, :selects
257
+ def_delegators :current_scope, :select_datetime, :selects_datetime
258
+ def_delegators :current_scope, :select_date, :selects_date
259
+ def_delegators :current_scope, :select_time, :selects_time
260
+ def_delegators :current_scope, :attach_file, :attaches_file
261
+ def_delegators :current_scope, :click_area, :clicks_area
262
+ def_delegators :current_scope, :click_link, :clicks_link
263
+ def_delegators :current_scope, :click_button, :clicks_button
264
+ def_delegators :current_scope, :field_labeled
265
+ def_delegators :current_scope, :field_by_xpath
266
+ def_delegators :current_scope, :field_with_id
267
+ def_delegators :current_scope, :select_option
268
+ def_delegators :current_scope, :field_named
269
+
270
+ private
271
+
272
+ def process_request(http_method, url, data, headers)
273
+ if headers.empty?
274
+ send "#{http_method}", url, data || {}
275
+ else
276
+ send "#{http_method}", url, data || {}, headers
277
+ end
278
+ end
279
+
280
+ def response_location
281
+ response.headers["Location"]
282
+ end
283
+
284
+ def current_host
285
+ URI.parse(current_url).host || @custom_headers["Host"] || "www.example.com"
286
+ end
287
+
288
+ def response_location_host
289
+ URI.parse(response_location).host || "www.example.com"
290
+ end
291
+
292
+ def reset
293
+ @elements = {}
294
+ @_scopes = nil
295
+ @_page_scope = nil
296
+ end
297
+
298
+ end
299
+ end
@@ -0,0 +1,115 @@
1
+ require "webrat/core/xml/nokogiri"
2
+ require "webrat/core/xml/hpricot"
3
+ require "webrat/core/xml/rexml"
4
+
5
+ module Webrat #:nodoc:
6
+ module XML #:nodoc:
7
+
8
+ def self.document(stringlike) #:nodoc:
9
+ if Webrat.configuration.parse_with_nokogiri?
10
+ Webrat.nokogiri_document(stringlike)
11
+ else
12
+ Webrat.rexml_document(Webrat.hpricot_document(stringlike).to_html)
13
+ end
14
+ end
15
+
16
+ def self.html_document(stringlike) #:nodoc:
17
+ if Webrat.configuration.parse_with_nokogiri?
18
+ Webrat.html_nokogiri_document(stringlike)
19
+ else
20
+ Webrat.rexml_document(Webrat.hpricot_document(stringlike).to_html)
21
+ end
22
+ end
23
+
24
+ def self.xml_document(stringlike) #:nodoc:
25
+ if Webrat.configuration.parse_with_nokogiri?
26
+ Webrat.xml_nokogiri_document(stringlike)
27
+ else
28
+ Webrat.rexml_document(Webrat.hpricot_document(stringlike).to_html)
29
+ end
30
+ end
31
+
32
+ def self.to_html(element)
33
+ if Webrat.configuration.parse_with_nokogiri?
34
+ element.to_html
35
+ else
36
+ element.to_s
37
+ end
38
+ end
39
+
40
+ def self.inner_html(element)
41
+ if Webrat.configuration.parse_with_nokogiri?
42
+ element.inner_html
43
+ else
44
+ element.text
45
+ end
46
+ end
47
+
48
+ def self.all_inner_text(element)
49
+ if Webrat.configuration.parse_with_nokogiri?
50
+ element.inner_text
51
+ else
52
+ Hpricot(element.to_s).children.first.inner_text
53
+ end
54
+ end
55
+
56
+ def self.inner_text(element)
57
+ if Webrat.configuration.parse_with_nokogiri?
58
+ element.inner_text
59
+ else
60
+ if defined?(Hpricot::Doc) && element.is_a?(Hpricot::Doc)
61
+ element.inner_text
62
+ else
63
+ element.text
64
+ end
65
+ end
66
+ end
67
+
68
+ def self.xpath_to(element)
69
+ if Webrat.configuration.parse_with_nokogiri?
70
+ element.path
71
+ else
72
+ element.xpath
73
+ end
74
+ end
75
+
76
+ def self.attribute(element, attribute_name)
77
+ return element[attribute_name] if element.is_a?(Hash)
78
+
79
+ if Webrat.configuration.parse_with_nokogiri?
80
+ element[attribute_name]
81
+ else
82
+ element.attributes[attribute_name]
83
+ end
84
+ end
85
+
86
+ def self.xpath_at(*args)
87
+ xpath_search(*args).first
88
+ end
89
+
90
+ def self.css_at(*args)
91
+ css_search(*args).first
92
+ end
93
+
94
+ def self.xpath_search(element, *searches)
95
+ searches.flatten.map do |search|
96
+ if Webrat.configuration.parse_with_nokogiri?
97
+ element.xpath(search)
98
+ else
99
+ REXML::XPath.match(element, search)
100
+ end
101
+ end.flatten.compact
102
+ end
103
+
104
+ def self.css_search(element, *searches) #:nodoc:
105
+ xpath_search(element, css_to_xpath(*searches))
106
+ end
107
+
108
+ def self.css_to_xpath(*selectors)
109
+ selectors.map do |rule|
110
+ Nokogiri::CSS.xpath_for(rule, :prefix => ".//")
111
+ end.flatten.uniq
112
+ end
113
+
114
+ end
115
+ end
@@ -0,0 +1,19 @@
1
+ module Webrat
2
+
3
+ def self.hpricot_document(stringlike)
4
+ return stringlike.dom if stringlike.respond_to?(:dom)
5
+
6
+ if Hpricot::Doc === stringlike
7
+ stringlike
8
+ elsif Hpricot::Elements === stringlike
9
+ stringlike
10
+ elsif StringIO === stringlike
11
+ Hpricot(stringlike.string)
12
+ elsif stringlike.respond_to?(:body)
13
+ Hpricot(stringlike.body.to_s)
14
+ else
15
+ Hpricot(stringlike.to_s)
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,76 @@
1
+ require "webrat/core_extensions/meta_class"
2
+
3
+ module Webrat
4
+
5
+ def self.nokogiri_document(stringlike) #:nodoc:
6
+ return stringlike.dom if stringlike.respond_to?(:dom)
7
+
8
+ if Nokogiri::HTML::Document === stringlike
9
+ stringlike
10
+ elsif Nokogiri::XML::NodeSet === stringlike
11
+ stringlike
12
+ elsif StringIO === stringlike
13
+ Nokogiri::HTML(stringlike.string)
14
+ elsif stringlike.respond_to?(:body)
15
+ Nokogiri::HTML(stringlike.body.to_s)
16
+ else
17
+ Nokogiri::HTML(stringlike.to_s)
18
+ end
19
+ end
20
+
21
+ def self.html_nokogiri_document(stringlike) #:nodoc:
22
+ return stringlike.dom if stringlike.respond_to?(:dom)
23
+
24
+ if Nokogiri::HTML::Document === stringlike
25
+ stringlike
26
+ elsif Nokogiri::XML::NodeSet === stringlike
27
+ stringlike
28
+ elsif StringIO === stringlike
29
+ Nokogiri::HTML(stringlike.string)
30
+ elsif stringlike.respond_to?(:body)
31
+ Nokogiri::HTML(stringlike.body.to_s)
32
+ else
33
+ Nokogiri::HTML(stringlike.to_s)
34
+ end
35
+ end
36
+
37
+ def self.xml_nokogiri_document(stringlike) #:nodoc:
38
+ return stringlike.dom if stringlike.respond_to?(:dom)
39
+
40
+ if Nokogiri::HTML::Document === stringlike
41
+ stringlike
42
+ elsif Nokogiri::XML::NodeSet === stringlike
43
+ stringlike
44
+ elsif StringIO === stringlike
45
+ Nokogiri::XML(stringlike.string)
46
+ elsif stringlike.respond_to?(:body)
47
+ Nokogiri::XML(stringlike.body.to_s)
48
+ else
49
+ Nokogiri::XML(stringlike.to_s)
50
+ end
51
+ end
52
+
53
+ def self.define_dom_method(object, dom) #:nodoc:
54
+ object.meta_class.send(:define_method, :dom) do
55
+ dom
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+
62
+ module Nokogiri #:nodoc:
63
+ module CSS #:nodoc:
64
+ class XPathVisitor #:nodoc:
65
+
66
+ def visit_pseudo_class_text(node) #:nodoc:
67
+ "@type='text'"
68
+ end
69
+
70
+ def visit_pseudo_class_password(node) #:nodoc:
71
+ "@type='password'"
72
+ end
73
+
74
+ end
75
+ end
76
+ end