winton-sum 0.1.0

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 (280) hide show
  1. data/Capfile +3 -0
  2. data/MIT-LICENSE +18 -0
  3. data/README.markdown +55 -0
  4. data/Rakefile +45 -0
  5. data/config/database.example.yml +10 -0
  6. data/config/deploy.example.rb +36 -0
  7. data/config/externals.yml +18 -0
  8. data/config/mail.example.yml +32 -0
  9. data/config/schedule.rb +20 -0
  10. data/config.ru +3 -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 +14 -0
  14. data/features/read_email.feature +446 -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 +32 -0
  19. data/features/step_definitions/when.rb +41 -0
  20. data/features/support/env.rb +27 -0
  21. data/features/support/helpers.rb +44 -0
  22. data/features/support/rspec.rb +11 -0
  23. data/features/support/webrat.rb +3 -0
  24. data/features/update_user.feature +76 -0
  25. data/gemspec.rb +45 -0
  26. data/lib/sum/boot.rb +29 -0
  27. data/lib/sum/controller/cron.rb +12 -0
  28. data/lib/sum/controller/front.rb +6 -0
  29. data/lib/sum/controller/new.rb +15 -0
  30. data/lib/sum/helper/application.rb +8 -0
  31. data/lib/sum/helper/cron.rb +12 -0
  32. data/lib/sum/helper/new.rb +26 -0
  33. data/lib/sum/model/incoming_mail.rb +89 -0
  34. data/lib/sum/model/user.rb +286 -0
  35. data/lib/sum/model/user_email.rb +31 -0
  36. data/lib/sum/view/email.haml +70 -0
  37. data/lib/sum/view/field.haml +10 -0
  38. data/lib/sum/view/form.haml +12 -0
  39. data/lib/sum/view/front.haml +25 -0
  40. data/lib/sum/view/layout.haml +26 -0
  41. data/lib/sum/view/new.haml +15 -0
  42. data/lib/sum.rb +30 -0
  43. data/public/image/1.png +0 -0
  44. data/public/image/2.png +0 -0
  45. data/public/image/3.png +0 -0
  46. data/public/image/bg.png +0 -0
  47. data/public/image/bot.png +0 -0
  48. data/public/image/facebox/b.png +0 -0
  49. data/public/image/facebox/bl.png +0 -0
  50. data/public/image/facebox/br.png +0 -0
  51. data/public/image/facebox/closelabel.gif +0 -0
  52. data/public/image/facebox/loading.gif +0 -0
  53. data/public/image/facebox/tl.png +0 -0
  54. data/public/image/facebox/tr.png +0 -0
  55. data/public/image/favicon.png +0 -0
  56. data/public/image/field_off.png +0 -0
  57. data/public/image/field_on.png +0 -0
  58. data/public/image/ribbon.png +0 -0
  59. data/public/image/screenshot_receive.png +0 -0
  60. data/public/image/screenshot_send.png +0 -0
  61. data/public/image/submit.png +0 -0
  62. data/public/image/top.png +0 -0
  63. data/public/javascript/facebox.js +319 -0
  64. data/public/javascript/jquery-1.3.2.js +19 -0
  65. data/public/javascript/sum.js +9 -0
  66. data/public/style/facebox.css +95 -0
  67. data/public/style/ie.css +35 -0
  68. data/public/style/print.css +30 -0
  69. data/public/style/screen.css +256 -0
  70. data/public/style/sum.css +22 -0
  71. data/public/style/sum.less +135 -0
  72. data/spec/spec.opts +1 -0
  73. data/spec/spec_helper.rb +58 -0
  74. data/spec/sum/model/incoming_mail_spec.rb +106 -0
  75. data/spec/sum/model/user_spec.rb +171 -0
  76. data/sum.gemspec +69 -0
  77. data/vendor/webrat/History.txt +358 -0
  78. data/vendor/webrat/MIT-LICENSE.txt +19 -0
  79. data/vendor/webrat/README.rdoc +85 -0
  80. data/vendor/webrat/Rakefile +200 -0
  81. data/vendor/webrat/install.rb +1 -0
  82. data/vendor/webrat/lib/webrat/core/configuration.rb +102 -0
  83. data/vendor/webrat/lib/webrat/core/elements/area.rb +31 -0
  84. data/vendor/webrat/lib/webrat/core/elements/element.rb +33 -0
  85. data/vendor/webrat/lib/webrat/core/elements/field.rb +409 -0
  86. data/vendor/webrat/lib/webrat/core/elements/form.rb +103 -0
  87. data/vendor/webrat/lib/webrat/core/elements/label.rb +31 -0
  88. data/vendor/webrat/lib/webrat/core/elements/link.rb +93 -0
  89. data/vendor/webrat/lib/webrat/core/elements/select_option.rb +35 -0
  90. data/vendor/webrat/lib/webrat/core/locators/area_locator.rb +38 -0
  91. data/vendor/webrat/lib/webrat/core/locators/button_locator.rb +54 -0
  92. data/vendor/webrat/lib/webrat/core/locators/field_by_id_locator.rb +37 -0
  93. data/vendor/webrat/lib/webrat/core/locators/field_labeled_locator.rb +56 -0
  94. data/vendor/webrat/lib/webrat/core/locators/field_locator.rb +25 -0
  95. data/vendor/webrat/lib/webrat/core/locators/field_named_locator.rb +41 -0
  96. data/vendor/webrat/lib/webrat/core/locators/form_locator.rb +19 -0
  97. data/vendor/webrat/lib/webrat/core/locators/label_locator.rb +34 -0
  98. data/vendor/webrat/lib/webrat/core/locators/link_locator.rb +74 -0
  99. data/vendor/webrat/lib/webrat/core/locators/locator.rb +20 -0
  100. data/vendor/webrat/lib/webrat/core/locators/select_option_locator.rb +59 -0
  101. data/vendor/webrat/lib/webrat/core/locators.rb +20 -0
  102. data/vendor/webrat/lib/webrat/core/logging.rb +24 -0
  103. data/vendor/webrat/lib/webrat/core/matchers/have_content.rb +73 -0
  104. data/vendor/webrat/lib/webrat/core/matchers/have_selector.rb +74 -0
  105. data/vendor/webrat/lib/webrat/core/matchers/have_tag.rb +21 -0
  106. data/vendor/webrat/lib/webrat/core/matchers/have_xpath.rb +147 -0
  107. data/vendor/webrat/lib/webrat/core/matchers.rb +4 -0
  108. data/vendor/webrat/lib/webrat/core/methods.rb +63 -0
  109. data/vendor/webrat/lib/webrat/core/mime.rb +29 -0
  110. data/vendor/webrat/lib/webrat/core/save_and_open_page.rb +48 -0
  111. data/vendor/webrat/lib/webrat/core/scope.rb +350 -0
  112. data/vendor/webrat/lib/webrat/core/session.rb +299 -0
  113. data/vendor/webrat/lib/webrat/core/xml/hpricot.rb +19 -0
  114. data/vendor/webrat/lib/webrat/core/xml/nokogiri.rb +76 -0
  115. data/vendor/webrat/lib/webrat/core/xml/rexml.rb +24 -0
  116. data/vendor/webrat/lib/webrat/core/xml.rb +115 -0
  117. data/vendor/webrat/lib/webrat/core.rb +14 -0
  118. data/vendor/webrat/lib/webrat/core_extensions/blank.rb +58 -0
  119. data/vendor/webrat/lib/webrat/core_extensions/deprecate.rb +8 -0
  120. data/vendor/webrat/lib/webrat/core_extensions/detect_mapped.rb +12 -0
  121. data/vendor/webrat/lib/webrat/core_extensions/meta_class.rb +6 -0
  122. data/vendor/webrat/lib/webrat/core_extensions/nil_to_param.rb +5 -0
  123. data/vendor/webrat/lib/webrat/core_extensions/tcp_socket.rb +27 -0
  124. data/vendor/webrat/lib/webrat/mechanize.rb +74 -0
  125. data/vendor/webrat/lib/webrat/merb.rb +9 -0
  126. data/vendor/webrat/lib/webrat/merb_multipart_support.rb +27 -0
  127. data/vendor/webrat/lib/webrat/merb_session.rb +82 -0
  128. data/vendor/webrat/lib/webrat/rack.rb +25 -0
  129. data/vendor/webrat/lib/webrat/rails.rb +106 -0
  130. data/vendor/webrat/lib/webrat/rspec-rails.rb +10 -0
  131. data/vendor/webrat/lib/webrat/selenium/application_server_factory.rb +40 -0
  132. data/vendor/webrat/lib/webrat/selenium/application_servers/base.rb +46 -0
  133. data/vendor/webrat/lib/webrat/selenium/application_servers/external.rb +26 -0
  134. data/vendor/webrat/lib/webrat/selenium/application_servers/merb.rb +50 -0
  135. data/vendor/webrat/lib/webrat/selenium/application_servers/rails.rb +44 -0
  136. data/vendor/webrat/lib/webrat/selenium/application_servers/sinatra.rb +37 -0
  137. data/vendor/webrat/lib/webrat/selenium/application_servers.rb +5 -0
  138. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/button.js +19 -0
  139. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/label.js +16 -0
  140. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webrat.js +5 -0
  141. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratlink.js +12 -0
  142. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratlinkwithin.js +15 -0
  143. data/vendor/webrat/lib/webrat/selenium/location_strategy_javascript/webratselectwithoption.js +5 -0
  144. data/vendor/webrat/lib/webrat/selenium/matchers/have_content.rb +66 -0
  145. data/vendor/webrat/lib/webrat/selenium/matchers/have_selector.rb +49 -0
  146. data/vendor/webrat/lib/webrat/selenium/matchers/have_tag.rb +72 -0
  147. data/vendor/webrat/lib/webrat/selenium/matchers/have_xpath.rb +45 -0
  148. data/vendor/webrat/lib/webrat/selenium/matchers.rb +4 -0
  149. data/vendor/webrat/lib/webrat/selenium/selenium_extensions.js +6 -0
  150. data/vendor/webrat/lib/webrat/selenium/selenium_rc_server.rb +84 -0
  151. data/vendor/webrat/lib/webrat/selenium/selenium_session.rb +248 -0
  152. data/vendor/webrat/lib/webrat/selenium/silence_stream.rb +18 -0
  153. data/vendor/webrat/lib/webrat/selenium.rb +81 -0
  154. data/vendor/webrat/lib/webrat/sinatra.rb +11 -0
  155. data/vendor/webrat/lib/webrat.rb +31 -0
  156. data/vendor/webrat/spec/fakes/test_session.rb +34 -0
  157. data/vendor/webrat/spec/integration/merb/Rakefile +35 -0
  158. data/vendor/webrat/spec/integration/merb/app/controllers/application.rb +2 -0
  159. data/vendor/webrat/spec/integration/merb/app/controllers/exceptions.rb +13 -0
  160. data/vendor/webrat/spec/integration/merb/app/controllers/testing.rb +27 -0
  161. data/vendor/webrat/spec/integration/merb/app/views/exceptions/not_acceptable.html.erb +63 -0
  162. data/vendor/webrat/spec/integration/merb/app/views/exceptions/not_found.html.erb +47 -0
  163. data/vendor/webrat/spec/integration/merb/app/views/layout/application.html.erb +12 -0
  164. data/vendor/webrat/spec/integration/merb/app/views/testing/show_form.html.erb +27 -0
  165. data/vendor/webrat/spec/integration/merb/app/views/testing/upload.html.erb +9 -0
  166. data/vendor/webrat/spec/integration/merb/config/environments/development.rb +15 -0
  167. data/vendor/webrat/spec/integration/merb/config/environments/rake.rb +11 -0
  168. data/vendor/webrat/spec/integration/merb/config/environments/test.rb +14 -0
  169. data/vendor/webrat/spec/integration/merb/config/init.rb +25 -0
  170. data/vendor/webrat/spec/integration/merb/config/rack.rb +11 -0
  171. data/vendor/webrat/spec/integration/merb/config/router.rb +34 -0
  172. data/vendor/webrat/spec/integration/merb/spec/spec.opts +1 -0
  173. data/vendor/webrat/spec/integration/merb/spec/spec_helper.rb +24 -0
  174. data/vendor/webrat/spec/integration/merb/spec/webrat_spec.rb +39 -0
  175. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/app_script.rb +31 -0
  176. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/common.rb +64 -0
  177. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/gem_ext.rb +124 -0
  178. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/main.thor +150 -0
  179. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/ops.rb +93 -0
  180. data/vendor/webrat/spec/integration/merb/tasks/merb.thor/utils.rb +40 -0
  181. data/vendor/webrat/spec/integration/rack/Rakefile +5 -0
  182. data/vendor/webrat/spec/integration/rack/app.rb +73 -0
  183. data/vendor/webrat/spec/integration/rack/test/helper.rb +20 -0
  184. data/vendor/webrat/spec/integration/rack/test/webrat_rack_test.rb +62 -0
  185. data/vendor/webrat/spec/integration/rails/Rakefile +30 -0
  186. data/vendor/webrat/spec/integration/rails/app/controllers/application.rb +15 -0
  187. data/vendor/webrat/spec/integration/rails/app/controllers/buttons_controller.rb +7 -0
  188. data/vendor/webrat/spec/integration/rails/app/controllers/fields_controller.rb +4 -0
  189. data/vendor/webrat/spec/integration/rails/app/controllers/links_controller.rb +7 -0
  190. data/vendor/webrat/spec/integration/rails/app/controllers/webrat_controller.rb +43 -0
  191. data/vendor/webrat/spec/integration/rails/app/helpers/buttons_helper.rb +2 -0
  192. data/vendor/webrat/spec/integration/rails/app/helpers/fields_helper.rb +2 -0
  193. data/vendor/webrat/spec/integration/rails/app/helpers/links_helper.rb +2 -0
  194. data/vendor/webrat/spec/integration/rails/app/views/buttons/show.html.erb +11 -0
  195. data/vendor/webrat/spec/integration/rails/app/views/fields/show.html.erb +9 -0
  196. data/vendor/webrat/spec/integration/rails/app/views/links/show.html.erb +5 -0
  197. data/vendor/webrat/spec/integration/rails/app/views/webrat/before_redirect_form.html.erb +4 -0
  198. data/vendor/webrat/spec/integration/rails/app/views/webrat/buttons.html.erb +11 -0
  199. data/vendor/webrat/spec/integration/rails/app/views/webrat/form.html.erb +28 -0
  200. data/vendor/webrat/spec/integration/rails/config/boot.rb +109 -0
  201. data/vendor/webrat/spec/integration/rails/config/environment.rb +12 -0
  202. data/vendor/webrat/spec/integration/rails/config/environments/development.rb +17 -0
  203. data/vendor/webrat/spec/integration/rails/config/environments/selenium.rb +22 -0
  204. data/vendor/webrat/spec/integration/rails/config/environments/test.rb +22 -0
  205. data/vendor/webrat/spec/integration/rails/config/initializers/inflections.rb +10 -0
  206. data/vendor/webrat/spec/integration/rails/config/initializers/mime_types.rb +5 -0
  207. data/vendor/webrat/spec/integration/rails/config/initializers/new_rails_defaults.rb +17 -0
  208. data/vendor/webrat/spec/integration/rails/config/locales/en.yml +5 -0
  209. data/vendor/webrat/spec/integration/rails/config/routes.rb +18 -0
  210. data/vendor/webrat/spec/integration/rails/public/404.html +30 -0
  211. data/vendor/webrat/spec/integration/rails/public/422.html +30 -0
  212. data/vendor/webrat/spec/integration/rails/public/500.html +33 -0
  213. data/vendor/webrat/spec/integration/rails/script/about +4 -0
  214. data/vendor/webrat/spec/integration/rails/script/console +3 -0
  215. data/vendor/webrat/spec/integration/rails/script/dbconsole +3 -0
  216. data/vendor/webrat/spec/integration/rails/script/destroy +3 -0
  217. data/vendor/webrat/spec/integration/rails/script/generate +3 -0
  218. data/vendor/webrat/spec/integration/rails/script/performance/benchmarker +3 -0
  219. data/vendor/webrat/spec/integration/rails/script/performance/profiler +3 -0
  220. data/vendor/webrat/spec/integration/rails/script/performance/request +3 -0
  221. data/vendor/webrat/spec/integration/rails/script/plugin +3 -0
  222. data/vendor/webrat/spec/integration/rails/script/process/inspector +3 -0
  223. data/vendor/webrat/spec/integration/rails/script/process/reaper +3 -0
  224. data/vendor/webrat/spec/integration/rails/script/process/spawner +3 -0
  225. data/vendor/webrat/spec/integration/rails/script/runner +3 -0
  226. data/vendor/webrat/spec/integration/rails/script/server +3 -0
  227. data/vendor/webrat/spec/integration/rails/test/integration/button_click_test.rb +80 -0
  228. data/vendor/webrat/spec/integration/rails/test/integration/fill_in_test.rb +24 -0
  229. data/vendor/webrat/spec/integration/rails/test/integration/link_click_test.rb +27 -0
  230. data/vendor/webrat/spec/integration/rails/test/integration/webrat_test.rb +97 -0
  231. data/vendor/webrat/spec/integration/rails/test/test_helper.rb +25 -0
  232. data/vendor/webrat/spec/integration/sinatra/Rakefile +5 -0
  233. data/vendor/webrat/spec/integration/sinatra/classic_app.rb +64 -0
  234. data/vendor/webrat/spec/integration/sinatra/modular_app.rb +16 -0
  235. data/vendor/webrat/spec/integration/sinatra/test/classic_app_test.rb +37 -0
  236. data/vendor/webrat/spec/integration/sinatra/test/modular_app_test.rb +18 -0
  237. data/vendor/webrat/spec/integration/sinatra/test/test_helper.rb +16 -0
  238. data/vendor/webrat/spec/private/core/configuration_spec.rb +116 -0
  239. data/vendor/webrat/spec/private/core/field_spec.rb +85 -0
  240. data/vendor/webrat/spec/private/core/link_spec.rb +24 -0
  241. data/vendor/webrat/spec/private/core/logging_spec.rb +10 -0
  242. data/vendor/webrat/spec/private/core/session_spec.rb +195 -0
  243. data/vendor/webrat/spec/private/mechanize/mechanize_session_spec.rb +81 -0
  244. data/vendor/webrat/spec/private/merb/attaches_file_spec.rb +93 -0
  245. data/vendor/webrat/spec/private/merb/merb_session_spec.rb +61 -0
  246. data/vendor/webrat/spec/private/nokogiri_spec.rb +77 -0
  247. data/vendor/webrat/spec/private/rails/attaches_file_spec.rb +81 -0
  248. data/vendor/webrat/spec/private/rails/rails_session_spec.rb +112 -0
  249. data/vendor/webrat/spec/private/selenium/application_servers/rails_spec.rb +26 -0
  250. data/vendor/webrat/spec/public/basic_auth_spec.rb +24 -0
  251. data/vendor/webrat/spec/public/check_spec.rb +191 -0
  252. data/vendor/webrat/spec/public/choose_spec.rb +118 -0
  253. data/vendor/webrat/spec/public/click_area_spec.rb +106 -0
  254. data/vendor/webrat/spec/public/click_button_spec.rb +496 -0
  255. data/vendor/webrat/spec/public/click_link_spec.rb +511 -0
  256. data/vendor/webrat/spec/public/fill_in_spec.rb +209 -0
  257. data/vendor/webrat/spec/public/locators/field_by_xpath_spec.rb +19 -0
  258. data/vendor/webrat/spec/public/locators/field_labeled_spec.rb +172 -0
  259. data/vendor/webrat/spec/public/locators/field_with_id_spec.rb +16 -0
  260. data/vendor/webrat/spec/public/matchers/contain_spec.rb +114 -0
  261. data/vendor/webrat/spec/public/matchers/have_selector_spec.rb +142 -0
  262. data/vendor/webrat/spec/public/matchers/have_tag_spec.rb +39 -0
  263. data/vendor/webrat/spec/public/matchers/have_xpath_spec.rb +136 -0
  264. data/vendor/webrat/spec/public/reload_spec.rb +10 -0
  265. data/vendor/webrat/spec/public/save_and_open_spec.rb +70 -0
  266. data/vendor/webrat/spec/public/select_date_spec.rb +112 -0
  267. data/vendor/webrat/spec/public/select_datetime_spec.rb +137 -0
  268. data/vendor/webrat/spec/public/select_spec.rb +249 -0
  269. data/vendor/webrat/spec/public/select_time_spec.rb +100 -0
  270. data/vendor/webrat/spec/public/selenium/application_server_factory_spec.rb +49 -0
  271. data/vendor/webrat/spec/public/selenium/application_servers/external_spec.rb +12 -0
  272. data/vendor/webrat/spec/public/selenium/selenium_session_spec.rb +37 -0
  273. data/vendor/webrat/spec/public/set_hidden_field_spec.rb +5 -0
  274. data/vendor/webrat/spec/public/submit_form_spec.rb +5 -0
  275. data/vendor/webrat/spec/public/visit_spec.rb +58 -0
  276. data/vendor/webrat/spec/public/within_spec.rb +177 -0
  277. data/vendor/webrat/spec/rcov.opts +1 -0
  278. data/vendor/webrat/spec/spec.opts +2 -0
  279. data/vendor/webrat/spec/spec_helper.rb +50 -0
  280. metadata +554 -0
@@ -0,0 +1,248 @@
1
+ require "webrat/core/save_and_open_page"
2
+ require "webrat/selenium/selenium_rc_server"
3
+ require "webrat/selenium/application_server_factory"
4
+ require "webrat/selenium/application_servers/base"
5
+
6
+ module Webrat
7
+ class TimeoutError < WebratError
8
+ end
9
+
10
+ class SeleniumResponse
11
+ attr_reader :body
12
+ attr_reader :session
13
+
14
+ def initialize(session, body)
15
+ @session = session
16
+ @body = body
17
+ end
18
+
19
+ def selenium
20
+ session.selenium
21
+ end
22
+ end
23
+
24
+ class SeleniumSession
25
+ include Webrat::SaveAndOpenPage
26
+ include Webrat::Selenium::SilenceStream
27
+
28
+ def initialize(*args) # :nodoc:
29
+ end
30
+
31
+ def simulate
32
+ end
33
+
34
+ def automate
35
+ yield
36
+ end
37
+
38
+ def visit(url)
39
+ selenium.open(url)
40
+ end
41
+
42
+ webrat_deprecate :visits, :visit
43
+
44
+ def fill_in(field_identifier, options)
45
+ locator = "webrat=#{field_identifier}"
46
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
47
+ selenium.type(locator, "#{options[:with]}")
48
+ end
49
+
50
+ webrat_deprecate :fills_in, :fill_in
51
+
52
+ def response
53
+ SeleniumResponse.new(self, response_body)
54
+ end
55
+
56
+ def response_body #:nodoc:
57
+ selenium.get_html_source
58
+ end
59
+
60
+ def current_url
61
+ selenium.location
62
+ end
63
+
64
+ def click_button(button_text_or_regexp = nil, options = {})
65
+ if button_text_or_regexp.is_a?(Hash) && options == {}
66
+ pattern, options = nil, button_text_or_regexp
67
+ elsif button_text_or_regexp
68
+ pattern = adjust_if_regexp(button_text_or_regexp)
69
+ end
70
+ pattern ||= '*'
71
+ locator = "button=#{pattern}"
72
+
73
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
74
+ selenium.click locator
75
+ end
76
+
77
+ webrat_deprecate :clicks_button, :click_button
78
+
79
+ def click_link(link_text_or_regexp, options = {})
80
+ pattern = adjust_if_regexp(link_text_or_regexp)
81
+ locator = "webratlink=#{pattern}"
82
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
83
+ selenium.click locator
84
+ end
85
+
86
+ webrat_deprecate :clicks_link, :click_link
87
+
88
+ def click_link_within(selector, link_text, options = {})
89
+ locator = "webratlinkwithin=#{selector}|#{link_text}"
90
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
91
+ selenium.click locator
92
+ end
93
+
94
+ webrat_deprecate :clicks_link_within, :click_link_within
95
+
96
+ def select(option_text, options = {})
97
+ id_or_name_or_label = options[:from]
98
+
99
+ if id_or_name_or_label
100
+ select_locator = "webrat=#{id_or_name_or_label}"
101
+ else
102
+ select_locator = "webratselectwithoption=#{option_text}"
103
+ end
104
+
105
+ selenium.wait_for_element select_locator, :timeout_in_seconds => 5
106
+ selenium.select(select_locator, option_text)
107
+ end
108
+
109
+ webrat_deprecate :selects, :select
110
+
111
+ def choose(label_text)
112
+ locator = "webrat=#{label_text}"
113
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
114
+ selenium.click locator
115
+ end
116
+
117
+ webrat_deprecate :chooses, :choose
118
+
119
+ def check(label_text)
120
+ locator = "webrat=#{label_text}"
121
+ selenium.wait_for_element locator, :timeout_in_seconds => 5
122
+ selenium.click locator
123
+ end
124
+ alias_method :uncheck, :check
125
+
126
+ webrat_deprecate :checks, :check
127
+
128
+ def fire_event(field_identifier, event)
129
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
130
+ selenium.fire_event(locator, "#{event}")
131
+ end
132
+
133
+ def key_down(field_identifier, key_code)
134
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
135
+ selenium.key_down(locator, key_code)
136
+ end
137
+
138
+ def key_up(field_identifier, key_code)
139
+ locator = "webrat=#{Regexp.escape(field_identifier)}"
140
+ selenium.key_up(locator, key_code)
141
+ end
142
+
143
+ def wait_for(params={})
144
+ timeout = params[:timeout] || 5
145
+ message = params[:message] || "Timeout exceeded"
146
+
147
+ begin_time = Time.now
148
+
149
+ while (Time.now - begin_time) < timeout
150
+ value = nil
151
+
152
+ begin
153
+ value = yield
154
+ rescue Exception => e
155
+ unless is_ignorable_wait_for_exception?(e)
156
+ raise e
157
+ end
158
+ end
159
+
160
+ return value if value
161
+
162
+ sleep 0.25
163
+ end
164
+
165
+ raise Webrat::TimeoutError.new(message + " (after #{timeout} sec)")
166
+ true
167
+ end
168
+
169
+ def selenium
170
+ return $browser if $browser
171
+ setup
172
+ $browser
173
+ end
174
+
175
+ webrat_deprecate :browser, :selenium
176
+
177
+
178
+ def save_and_open_screengrab
179
+ return unless File.exist?(saved_page_dir)
180
+
181
+ filename = "#{saved_page_dir}/webrat-#{Time.now.to_i}.png"
182
+
183
+ if $browser.chrome_backend?
184
+ $browser.capture_entire_page_screenshot(filename, '')
185
+ else
186
+ $browser.capture_screenshot(filename)
187
+ end
188
+ open_in_browser(filename)
189
+
190
+ end
191
+
192
+ protected
193
+ def is_ignorable_wait_for_exception?(exception) #:nodoc:
194
+ if defined?(::Spec::Expectations::ExpectationNotMetError)
195
+ return true if exception.class == ::Spec::Expectations::ExpectationNotMetError
196
+ end
197
+ return true if [::Selenium::CommandError, Webrat::WebratError].include?(exception.class)
198
+ return false
199
+ end
200
+
201
+ def setup #:nodoc:
202
+ Webrat::Selenium::SeleniumRCServer.boot
203
+ Webrat::Selenium::ApplicationServerFactory.app_server_instance.boot
204
+
205
+ create_browser
206
+ $browser.start
207
+
208
+ extend_selenium
209
+ define_location_strategies
210
+ $browser.window_maximize
211
+ end
212
+
213
+
214
+ def create_browser
215
+ $browser = ::Selenium::Client::Driver.new(Webrat.configuration.selenium_server_address || "localhost",
216
+ Webrat.configuration.selenium_server_port, Webrat.configuration.selenium_browser_key, "http://#{Webrat.configuration.application_address}:#{Webrat.configuration.application_port}")
217
+ $browser.set_speed(0) unless Webrat.configuration.selenium_server_address
218
+
219
+ at_exit do
220
+ silence_stream(STDOUT) do
221
+ $browser.stop
222
+ end
223
+ end
224
+ end
225
+
226
+ def adjust_if_regexp(text_or_regexp) #:nodoc:
227
+ if text_or_regexp.is_a?(Regexp)
228
+ "evalregex:#{text_or_regexp.inspect}"
229
+ else
230
+ "evalregex:/#{text_or_regexp}/"
231
+ end
232
+ end
233
+
234
+ def extend_selenium #:nodoc:
235
+ extensions_file = File.join(File.dirname(__FILE__), "selenium_extensions.js")
236
+ extenions_js = File.read(extensions_file)
237
+ selenium.get_eval(extenions_js)
238
+ end
239
+
240
+ def define_location_strategies #:nodoc:
241
+ Dir[File.join(File.dirname(__FILE__), "location_strategy_javascript", "*.js")].sort.each do |file|
242
+ strategy_js = File.read(file)
243
+ strategy_name = File.basename(file, '.js')
244
+ selenium.add_location_strategy(strategy_name, strategy_js)
245
+ end
246
+ end
247
+ end
248
+ end
@@ -0,0 +1,18 @@
1
+ module Webrat
2
+ module Selenium
3
+ module SilenceStream
4
+ # active_support already defines silence_stream, no need to do that again if it's already present.
5
+ # http://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/kernel/reporting.rb
6
+ unless Kernel.respond_to?(:silence_stream)
7
+ def silence_stream(stream)
8
+ old_stream = stream.dup
9
+ stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
10
+ stream.sync = true
11
+ yield
12
+ ensure
13
+ stream.reopen(old_stream)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,81 @@
1
+ require "webrat"
2
+ gem "selenium-client", ">=1.2.14"
3
+ require "selenium/client"
4
+ require "webrat/selenium/silence_stream"
5
+ require "webrat/selenium/selenium_session"
6
+ require "webrat/selenium/matchers"
7
+ require "webrat/core_extensions/tcp_socket"
8
+
9
+ module Webrat
10
+ # To use Webrat's Selenium support, you'll need the selenium-client gem installed.
11
+ # Activate it with (for example, in your <tt>env.rb</tt>):
12
+ #
13
+ # require "webrat"
14
+ #
15
+ # Webrat.configure do |config|
16
+ # config.mode = :selenium
17
+ # end
18
+ #
19
+ # == Dropping down to the selenium-client API
20
+ #
21
+ # If you ever need to do something with Selenium not provided in the Webrat API,
22
+ # you can always drop down to the selenium-client API using the <tt>selenium</tt> method.
23
+ # For example:
24
+ #
25
+ # When "I drag the photo to the left" do
26
+ # selenium.dragdrop("id=photo_123", "+350, 0")
27
+ # end
28
+ #
29
+ # == Choosing the underlying framework to test
30
+ #
31
+ # Webrat assumes you're using rails by default but it can also work with sinatra
32
+ # and merb. To take advantage of this you can use the configuration block to
33
+ # set the application_framework variable.
34
+ # require "webrat"
35
+ #
36
+ # Webrat.configure do |config|
37
+ # config.mode = :selenium
38
+ # config.application_port = 4567
39
+ # config.application_framework = :sinatra # could also be :merb
40
+ # end
41
+ #
42
+ # == Auto-starting of the appserver and java server
43
+ #
44
+ # Webrat will automatically start the Selenium Java server process and an instance
45
+ # of Mongrel when a test is run. The Mongrel will run in the "selenium" environment
46
+ # instead of "test", so ensure you've got that defined, and will run on port
47
+ # Webrat.configuration.application_port.
48
+ #
49
+ # == Waiting
50
+ #
51
+ # In order to make writing Selenium tests as easy as possible, Webrat will automatically
52
+ # wait for the correct elements to exist on the page when trying to manipulate them
53
+ # with methods like <tt>fill_in</tt>, etc. In general, this means you should be able to write
54
+ # your Webrat::Selenium tests ignoring the concurrency issues that can plague in-browser
55
+ # testing, so long as you're using the Webrat API.
56
+ module Selenium
57
+ module Methods
58
+ def response
59
+ webrat_session.response
60
+ end
61
+
62
+ def wait_for(*args, &block)
63
+ webrat_session.wait_for(*args, &block)
64
+ end
65
+
66
+ def save_and_open_screengrab
67
+ webrat_session.save_and_open_screengrab
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ if defined?(ActionController::IntegrationTest)
74
+ module ActionController #:nodoc:
75
+ IntegrationTest.class_eval do
76
+ include Webrat::Methods
77
+ include Webrat::Selenium::Methods
78
+ include Webrat::Selenium::Matchers
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,11 @@
1
+ require "webrat/rack"
2
+
3
+ module Webrat
4
+ class SinatraSession < RackSession
5
+ def initialize(context)
6
+ app = context.respond_to?(:app) ? context.app : Sinatra::Application
7
+
8
+ super(Rack::Test::Session.new(Rack::MockSession.new(app, "www.example.com")))
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,31 @@
1
+ require "rubygems"
2
+
3
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
4
+
5
+ module Webrat
6
+ # The common base class for all exceptions raised by Webrat.
7
+ class WebratError < StandardError
8
+ end
9
+
10
+ VERSION = '0.4.4'
11
+
12
+ def self.require_xml
13
+ if on_java?
14
+ gem "nokogiri", ">= 1.2.4"
15
+ else
16
+ gem "nokogiri", ">= 1.0.6"
17
+ end
18
+
19
+ require "nokogiri"
20
+ require "webrat/core/xml/nokogiri"
21
+ end
22
+
23
+ def self.on_java?
24
+ RUBY_PLATFORM =~ /java/
25
+ end
26
+
27
+ end
28
+
29
+ Webrat.require_xml
30
+
31
+ require "webrat/core"
@@ -0,0 +1,34 @@
1
+ module Webrat #:nodoc:
2
+ def self.session_class #:nodoc:
3
+ TestSession
4
+ end
5
+
6
+ class TestSession < Session #:nodoc:
7
+ attr_accessor :response_body
8
+ attr_writer :response_code
9
+
10
+ def doc_root
11
+ File.expand_path(File.join(".", "public"))
12
+ end
13
+
14
+ def response
15
+ @response ||= Object.new
16
+ end
17
+
18
+ def response_code
19
+ @response_code || 200
20
+ end
21
+
22
+ def get(url, data, headers = nil)
23
+ end
24
+
25
+ def post(url, data, headers = nil)
26
+ end
27
+
28
+ def put(url, data, headers = nil)
29
+ end
30
+
31
+ def delete(url, data, headers = nil)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,35 @@
1
+ require 'rubygems'
2
+ require 'rake/rdoctask'
3
+
4
+ require 'merb-core'
5
+ require 'merb-core/tasks/merb'
6
+
7
+ include FileUtils
8
+
9
+ # Load the basic runtime dependencies; this will include
10
+ # any plugins and therefore plugin rake tasks.
11
+ init_env = ENV['MERB_ENV'] || 'rake'
12
+ Merb.load_dependencies(:environment => init_env)
13
+
14
+ # Get Merb plugins and dependencies
15
+ Merb::Plugins.rakefiles.each { |r| require r }
16
+
17
+ # Load any app level custom rakefile extensions from lib/tasks
18
+ tasks_path = File.join(File.dirname(__FILE__), "lib", "tasks")
19
+ rake_files = Dir["#{tasks_path}/*.rake"]
20
+ rake_files.each{|rake_file| load rake_file }
21
+
22
+ desc "Start runner environment"
23
+ task :merb_env do
24
+ Merb.start_environment(:environment => init_env, :adapter => 'runner')
25
+ end
26
+
27
+ require 'spec/rake/spectask'
28
+ require 'merb-core/test/tasks/spectasks'
29
+ desc 'Default: run spec examples'
30
+ task :default => 'spec'
31
+
32
+ ##############################################################################
33
+ # ADD YOUR CUSTOM TASKS IN /lib/tasks
34
+ # NAME YOUR RAKE FILES file_name.rake
35
+ ##############################################################################
@@ -0,0 +1,2 @@
1
+ class Application < Merb::Controller
2
+ end
@@ -0,0 +1,13 @@
1
+ class Exceptions < Merb::Controller
2
+
3
+ # handle NotFound exceptions (404)
4
+ def not_found
5
+ render :format => :html
6
+ end
7
+
8
+ # handle NotAcceptable exceptions (406)
9
+ def not_acceptable
10
+ render :format => :html
11
+ end
12
+
13
+ end
@@ -0,0 +1,27 @@
1
+ class Testing < Application
2
+
3
+ def show_form
4
+ render
5
+ end
6
+
7
+ def upload
8
+ case request.method
9
+ when :get then render
10
+ when :post then
11
+ uploaded_file = params[:uploaded_file]
12
+ render [uploaded_file[:filename], uploaded_file[:tempfile].class.name].inspect
13
+ end
14
+ end
15
+
16
+ def submit_form
17
+ end
18
+
19
+ def internal_redirect
20
+ redirect "/"
21
+ end
22
+
23
+ def external_redirect
24
+ redirect "http://google.com"
25
+ end
26
+
27
+ end
@@ -0,0 +1,63 @@
1
+ <div id="container">
2
+ <div id="header-container">
3
+ <img src="/images/merb.jpg" />
4
+ <!-- <h1>Mongrel + Erb</h1> -->
5
+ <h2>pocket rocket web framework</h2>
6
+ <hr />
7
+ </div>
8
+
9
+ <div id="left-container">
10
+ <h3>Exception:</h3>
11
+ <p><%= request.exceptions.first.message %></p>
12
+ </div>
13
+
14
+ <div id="main-container">
15
+ <h3>Why am I seeing this page?</h3>
16
+ <p>Merb couldn't find an appropriate content_type to return,
17
+ based on what you said was available via provides() and
18
+ what the client requested.</p>
19
+
20
+ <h3>How to add a mime-type</h3>
21
+ <pre><code>
22
+ Merb.add_mime_type :pdf, :to_pdf, %w[application/pdf], &quot;Content-Encoding&quot; =&gt; &quot;gzip&quot;
23
+ </code></pre>
24
+ <h3>What this means is:</h3>
25
+ <ul>
26
+ <li>Add a mime-type for :pdf</li>
27
+ <li>Register the method for converting objects to PDF as <code>#to_pdf</code>.</li>
28
+ <li>Register the incoming mime-type "Accept" header as <code>application/pdf</code>.</li>
29
+ <li>Specify a new header for PDF types so it will set <code>Content-Encoding</code> to gzip.</li>
30
+ </ul>
31
+
32
+ <h3>You can then do:</h3>
33
+ <pre><code>
34
+ class Foo &lt; Application
35
+ provides :pdf
36
+ end
37
+ </code></pre>
38
+
39
+ <h3>Where can I find help?</h3>
40
+ <p>If you have any questions or if you can't figure something out, please take a
41
+ look at our <a href="http://merbivore.com/"> project page</a>,
42
+ feel free to come chat at irc.freenode.net, channel #merb,
43
+ or post to <a href="http://groups.google.com/group/merb">merb mailing list</a>
44
+ on Google Groups.</p>
45
+
46
+ <h3>What if I've found a bug?</h3>
47
+ <p>If you want to file a bug or make your own contribution to Merb,
48
+ feel free to register and create a ticket at our
49
+ <a href="http://merb.lighthouseapp.com/">project development page</a>
50
+ on Lighthouse.</p>
51
+
52
+ <h3>How do I edit this page?</h3>
53
+ <p>You can change what people see when this happens by editing <tt>app/views/exceptions/not_acceptable.html.erb</tt>.</p>
54
+
55
+ </div>
56
+
57
+ <div id="footer-container">
58
+ <hr />
59
+ <div class="left"></div>
60
+ <div class="right">&copy; 2008 the merb dev team</div>
61
+ <p>&nbsp;</p>
62
+ </div>
63
+ </div>
@@ -0,0 +1,47 @@
1
+ <div id="container">
2
+ <div id="header-container">
3
+ <img src="/images/merb.jpg" />
4
+ <!-- <h1>Mongrel + Erb</h1> -->
5
+ <h2>pocket rocket web framework</h2>
6
+ <hr />
7
+ </div>
8
+
9
+ <div id="left-container">
10
+ <h3>Exception:</h3>
11
+ <p><%= request.exceptions.first.message %></p>
12
+ </div>
13
+
14
+ <div id="main-container">
15
+ <h3>Welcome to Merb!</h3>
16
+ <p>Merb is a light-weight MVC framework written in Ruby. We hope you enjoy it.</p>
17
+
18
+ <h3>Where can I find help?</h3>
19
+ <p>If you have any questions or if you can't figure something out, please take a
20
+ look at our <a href="http://merbivore.com/"> project page</a>,
21
+ feel free to come chat at irc.freenode.net, channel #merb,
22
+ or post to <a href="http://groups.google.com/group/merb">merb mailing list</a>
23
+ on Google Groups.</p>
24
+
25
+ <h3>What if I've found a bug?</h3>
26
+ <p>If you want to file a bug or make your own contribution to Merb,
27
+ feel free to register and create a ticket at our
28
+ <a href="http://merb.lighthouseapp.com/">project development page</a>
29
+ on Lighthouse.</p>
30
+
31
+ <h3>How do I edit this page?</h3>
32
+ <p>You're seeing this page because you need to edit the following files:
33
+ <ul>
34
+ <li>config/router.rb <strong><em>(recommended)</em></strong></li>
35
+ <li>app/views/exceptions/not_found.html.erb <strong><em>(recommended)</em></strong></li>
36
+ <li>app/views/layout/application.html.erb <strong><em>(change this layout)</em></strong></li>
37
+ </ul>
38
+ </p>
39
+ </div>
40
+
41
+ <div id="footer-container">
42
+ <hr />
43
+ <div class="left"></div>
44
+ <div class="right">&copy; 2008 the merb dev team</div>
45
+ <p>&nbsp;</p>
46
+ </div>
47
+ </div>
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
3
+ <head>
4
+ <title>Fresh Merb App</title>
5
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6
+ <link rel="stylesheet" href="/stylesheets/master.css" type="text/css" media="screen" charset="utf-8" />
7
+ </head>
8
+ <body>
9
+ <%#= message[:notice] %>
10
+ <%= catch_content :for_layout %>
11
+ </body>
12
+ </html>
@@ -0,0 +1,27 @@
1
+ <h1>Webrat Form</h1>
2
+
3
+ <form action="/testing/submit_form" method="post">
4
+ <label>
5
+ Text field
6
+ <input type="text" name="text_field" />
7
+ </label>
8
+
9
+ <label>
10
+ TOS <input type="checkbox" name="tos" />
11
+ </label>
12
+
13
+ <label>
14
+ Prefilled
15
+ <input type="text" name="prefilled" value="text" />
16
+ </label>
17
+
18
+ <label>
19
+ Month
20
+ <select name="month">
21
+ <option>None</option>
22
+ <option>January</option>
23
+ </select>
24
+ </label>
25
+
26
+ <input type="submit" value="Test">
27
+ </form>
@@ -0,0 +1,9 @@
1
+ <h1>Webrat Form</h1>
2
+
3
+ <form action="/upload" method="post">
4
+ <label>
5
+ File
6
+ <input type="file" name="uploaded_file" />
7
+ </label>
8
+ <input type="submit" value="Upload">
9
+ </form>
@@ -0,0 +1,15 @@
1
+ Merb.logger.info("Loaded DEVELOPMENT Environment...")
2
+ Merb::Config.use { |c|
3
+ c[:exception_details] = true
4
+ c[:reload_templates] = true
5
+ c[:reload_classes] = true
6
+ c[:reload_time] = 0.5
7
+ c[:ignore_tampered_cookies] = true
8
+ c[:log_auto_flush ] = true
9
+ c[:log_level] = :debug
10
+
11
+ c[:log_stream] = STDOUT
12
+ c[:log_file] = nil
13
+ # Or redirect logging into a file:
14
+ # c[:log_file] = Merb.root / "log" / "development.log"
15
+ }