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,446 @@
1
+ Feature: Read email
2
+
3
+ As a user
4
+ I want to read a budget email
5
+ In order to know how much I can spend
6
+
7
+ Background:
8
+ Given today is June 1, 2009
9
+ And I have created an account with these attributes:
10
+ | savings | income | bills |
11
+ | 1000 | 5000 | 2500 |
12
+ # income - bills - savings = 1500 (spending money)
13
+ And my email queue is empty
14
+
15
+ Scenario: I see some static information every day
16
+ When the background job runs
17
+ And I open the email
18
+ Then I should see "Today's budget" in the subject
19
+ And I should see "Fiscal month: 06/01/09 to 07/01/09 (30 days)" in the email
20
+
21
+
22
+ # Day 1
23
+
24
+ Scenario: I see budget information for day 1, having spent nothing today
25
+ When the background job runs
26
+ And I open the email
27
+ Then I should see in the email:
28
+ """
29
+ You can spend $50.00 today.
30
+
31
+ If you don't spend anything today, you will have
32
+ $51.72 to spend each day.
33
+ $362.07 to spend each week.
34
+ $1500.00 to spend over the next 29 days.
35
+
36
+ You have saved $50.00 more than expected for a 1 day period.
37
+ """
38
+ # days in month = 30
39
+ # spending money / days in month = 50
40
+ # days left = 29
41
+ # spending money / days left = 51.72
42
+ # spending money / days left * 7 = 362.07
43
+
44
+ Scenario: I see budget information for day 1, having deposited money
45
+ Given it is day 1
46
+ And I have deposited $1.00
47
+ When the background job runs
48
+ And I open the email
49
+ Then I should see in the email:
50
+ """
51
+ You can spend $51.00 today.
52
+
53
+ If you don't spend anything today, you will have
54
+ $51.76 to spend each day.
55
+ $362.31 to spend each week.
56
+ $1501.00 to spend over the next 29 days.
57
+
58
+ You have saved $51.00 more than expected for a 1 day period.
59
+ """
60
+ # (spending money / days in month) - spent today = 51
61
+ # spending money + 1 = 1501
62
+
63
+ Scenario: I see budget information for day 1, having spent under budget
64
+ Given it is day 1
65
+ And today I have spent $49.00
66
+ When the background job runs
67
+ And I open the email
68
+ Then I should see in the email:
69
+ """
70
+ You can spend $1.00 today.
71
+
72
+ If you only spend $49.00 today, you will have
73
+ $50.03 to spend each day.
74
+ $350.24 to spend each week.
75
+ $1451.00 to spend over the next 29 days.
76
+
77
+ You have saved $1.00 more than expected for a 1 day period.
78
+ """
79
+
80
+ Scenario: I see budget information for day 1, having spent exactly my budget
81
+ Given it is day 1
82
+ And today I have spent $50.00
83
+ When the background job runs
84
+ And I open the email
85
+ Then I should see in the email:
86
+ """
87
+ You have spent your budget for today.
88
+
89
+ If you only spend $50.00 today, you will have
90
+ $50.00 to spend each day.
91
+ $350.00 to spend each week.
92
+ $1450.00 to spend over the next 29 days.
93
+
94
+ You have spent exactly as expected for a 1 day period.
95
+ """
96
+
97
+ Scenario: I see budget information for day 1, having spent over budget
98
+ Given it is day 1
99
+ And today I have spent $51.00
100
+ When the background job runs
101
+ And I open the email
102
+ Then I should see in the email:
103
+ """
104
+ You have spent your budget for today, plus an additional $1.00.
105
+
106
+ If you only spend $51.00 today, you will have
107
+ $49.97 to spend each day.
108
+ $349.76 to spend each week.
109
+ $1449.00 to spend over the next 29 days.
110
+
111
+ You have spent $1.00 more than expected for a 1 day period.
112
+ """
113
+
114
+ Scenario: I see budget information for day 1, having spent all of my spending money
115
+ Given it is day 1
116
+ And today I have spent $1500.00
117
+ When the background job runs
118
+ And I open the email
119
+ Then I should see in the email:
120
+ """
121
+ You should not spend any money for the next 29 days if you want to continue to save $1000.00.
122
+
123
+ If you wish to spend into your savings this month, you can afford to spend
124
+ $34.48 each day.
125
+ $241.38 each week.
126
+ $1000.00 over the next 29 days.
127
+
128
+ You have spent $1450.00 more than expected for a 1 day period.
129
+ """
130
+ # total left = 1000
131
+ # total left / days left = 34.48
132
+ # total left / days left * 7 = 241.38
133
+
134
+ Scenario: I see budget information for day 1, having spent all of my savings
135
+ Given it is day 1
136
+ And today I have spent $2500.00
137
+ When the background job runs
138
+ And I open the email
139
+ Then I should see in the email:
140
+ """
141
+ You should not spend any money for the next 29 days if you want to avoid going into debt.
142
+
143
+ You have spent $2450.00 more than expected for a 1 day period.
144
+ """
145
+
146
+ Scenario: I see budget information for day 1, having gone into debt
147
+ Given it is day 1
148
+ And today I have spent $2501.00
149
+ When the background job runs
150
+ And I open the email
151
+ Then I should see in the email:
152
+ """
153
+ You need to earn $0.03 today.
154
+
155
+ Continue to do so for the next 29 days to avoid going into debt.
156
+
157
+ If you do not, Sum will temporarily decrease your spending money for next month to account for the debt.
158
+
159
+ You have spent $2451.00 more than expected for a 1 day period.
160
+ """
161
+ # total left = -1
162
+ # total left / days left including today * -1 = 0.03
163
+
164
+ # Day 15
165
+
166
+ Scenario: I see budget information for day 15, having spent nothing today
167
+ Given it is day 15
168
+ And before today I spent $700.00
169
+ And today I have spent $0.00
170
+ When the background job runs
171
+ And I open the email
172
+ Then I should see in the email:
173
+ """
174
+ You can spend $50.00 today.
175
+
176
+ If you don't spend anything today, you will have
177
+ $53.33 to spend each day.
178
+ $373.33 to spend each week.
179
+ $800.00 to spend over the next 15 days.
180
+
181
+ You have saved $50.00 more than expected for a 15 day period.
182
+ """
183
+
184
+ Scenario: I see budget information for day 15, having deposited money
185
+ Given it is day 15
186
+ And I have deposited $1.00
187
+ And before today I spent $700.00
188
+ When the background job runs
189
+ And I open the email
190
+ Then I should see in the email:
191
+ """
192
+ You can spend $51.00 today.
193
+
194
+ If you don't spend anything today, you will have
195
+ $53.40 to spend each day.
196
+ $373.80 to spend each week.
197
+ $801.00 to spend over the next 15 days.
198
+
199
+ You have saved $51.00 more than expected for a 15 day period.
200
+ """
201
+
202
+ Scenario: I see budget information for day 15, having spent under budget
203
+ Given it is day 15
204
+ And before today I spent $700.00
205
+ And today I have spent $49.00
206
+ When the background job runs
207
+ And I open the email
208
+ Then I should see in the email:
209
+ """
210
+ You can spend $1.00 today.
211
+
212
+ If you only spend $49.00 today, you will have
213
+ $50.07 to spend each day.
214
+ $350.47 to spend each week.
215
+ $751.00 to spend over the next 15 days.
216
+
217
+ You have saved $1.00 more than expected for a 15 day period.
218
+ """
219
+
220
+ Scenario: I see budget information for day 15, having spent exactly my budget
221
+ Given it is day 15
222
+ And before today I spent $700.00
223
+ And today I have spent $50.00
224
+ When the background job runs
225
+ And I open the email
226
+ Then I should see in the email:
227
+ """
228
+ You have spent your budget for today.
229
+
230
+ If you only spend $50.00 today, you will have
231
+ $50.00 to spend each day.
232
+ $350.00 to spend each week.
233
+ $750.00 to spend over the next 15 days.
234
+
235
+ You have spent exactly as expected for a 15 day period.
236
+ """
237
+
238
+ Scenario: I see budget information for day 15, having spent over budget
239
+ Given it is day 15
240
+ And before today I spent $700.00
241
+ And today I have spent $51.00
242
+ When the background job runs
243
+ And I open the email
244
+ Then I should see in the email:
245
+ """
246
+ You have spent your budget for today, plus an additional $1.00.
247
+
248
+ If you only spend $51.00 today, you will have
249
+ $49.93 to spend each day.
250
+ $349.53 to spend each week.
251
+ $749.00 to spend over the next 15 days.
252
+
253
+ You have spent $1.00 more than expected for a 15 day period.
254
+ """
255
+
256
+ Scenario: I see budget information for day 15, having spent all of my spending money
257
+ Given it is day 15
258
+ And before today I spent $700.00
259
+ And today I have spent $800.00
260
+ When the background job runs
261
+ And I open the email
262
+ Then I should see in the email:
263
+ """
264
+ You should not spend any money for the next 15 days if you want to continue to save $1000.00.
265
+
266
+ If you wish to spend into your savings this month, you can afford to spend
267
+ $66.67 each day.
268
+ $466.67 each week.
269
+ $1000.00 over the next 15 days.
270
+
271
+ You have spent $750.00 more than expected for a 15 day period.
272
+ """
273
+
274
+ Scenario: I see budget information for day 15, having spent all of my savings
275
+ Given it is day 15
276
+ And before today I spent $700.00
277
+ And today I have spent $1050.00
278
+ When the background job runs
279
+ And I open the email
280
+ Then I should see in the email:
281
+ """
282
+ You should not spend any money for the next 15 days if you want to continue to save $750.00.
283
+
284
+ If you wish to spend into your savings this month, you can afford to spend
285
+ $50.00 each day.
286
+ $350.00 each week.
287
+ $750.00 over the next 15 days.
288
+
289
+ You have spent $1000.00 more than expected for a 15 day period.
290
+ """
291
+
292
+ Scenario: I see budget information for day 15, having gone into debt
293
+ Given it is day 15
294
+ And before today I spent $700.00
295
+ And today I have spent $1801.00
296
+ When the background job runs
297
+ And I open the email
298
+ Then I should see in the email:
299
+ """
300
+ You need to earn $0.06 today.
301
+
302
+ Continue to do so for the next 15 days to avoid going into debt.
303
+
304
+ If you do not, Sum will temporarily decrease your spending money for next month to account for the debt.
305
+
306
+ You have spent $1751.00 more than expected for a 15 day period.
307
+ """
308
+
309
+ # Day 30
310
+
311
+ Scenario: I see budget information for day 30, having spent nothing today
312
+ Given it is day 30
313
+ And before today I spent $1450.00
314
+ And today I have spent $0.00
315
+ When the background job runs
316
+ And I open the email
317
+ Then I should see in the email:
318
+ """
319
+ You can spend $50.00 today.
320
+
321
+ You have saved $50.00 more than expected for a 30 day period.
322
+ """
323
+
324
+ Scenario: I see budget information for day 30, having deposited money
325
+ Given it is day 30
326
+ And I have deposited $1.00
327
+ And before today I spent $1450.00
328
+ When the background job runs
329
+ And I open the email
330
+ Then I should see in the email:
331
+ """
332
+ You can spend $51.00 today.
333
+
334
+ You have saved $51.00 more than expected for a 30 day period.
335
+ """
336
+
337
+ Scenario: I see budget information for day 30, having spent under budget
338
+ Given it is day 30
339
+ And before today I spent $1450.00
340
+ And today I have spent $49.00
341
+ When the background job runs
342
+ And I open the email
343
+ Then I should see in the email:
344
+ """
345
+ You can spend $1.00 today.
346
+
347
+ You have saved $1.00 more than expected for a 30 day period.
348
+ """
349
+
350
+ Scenario: I see budget information for day 30, having spent exactly my budget
351
+ Given it is day 30
352
+ And before today I spent $1450.00
353
+ And today I have spent $50.00
354
+ When the background job runs
355
+ And I open the email
356
+ Then I should see in the email:
357
+ """
358
+ You should not spend any money if you want to continue to save $1000.00.
359
+
360
+ You have spent exactly as expected for a 30 day period.
361
+ """
362
+
363
+ Scenario: I see budget information for day 30, having spent over budget
364
+ Given it is day 30
365
+ And before today I spent $1450.00
366
+ And today I have spent $51.00
367
+ When the background job runs
368
+ And I open the email
369
+ Then I should see in the email:
370
+ """
371
+ You should not spend any money if you want to continue to save $999.00.
372
+
373
+ You have spent $1.00 more than expected for a 30 day period.
374
+ """
375
+
376
+ Scenario: I see budget information for day 30, having spent all of my savings
377
+ Given it is day 30
378
+ And before today I spent $1450.00
379
+ And today I have spent $1050.00
380
+ When the background job runs
381
+ And I open the email
382
+ Then I should see in the email:
383
+ """
384
+ You should not spend any money if you want to avoid going into debt.
385
+
386
+ You have spent $1000.00 more than expected for a 30 day period.
387
+ """
388
+
389
+ Scenario: I see budget information for day 30, having gone into debt
390
+ Given it is day 30
391
+ And before today I spent $1450.00
392
+ And today I have spent $1051.00
393
+ When the background job runs
394
+ And I open the email
395
+ Then I should see in the email:
396
+ """
397
+ You need to earn $1.00 today.
398
+
399
+ If you do not, Sum will temporarily decrease your spending money for next month to account for the debt.
400
+
401
+ You have spent $1001.00 more than expected for a 30 day period.
402
+ """
403
+
404
+
405
+ # Transactions
406
+
407
+ Scenario: I see my last transaction
408
+ Given today I have spent $1.00
409
+ When the background job runs
410
+ And I open the email
411
+ Then I should see in the email:
412
+ """
413
+ Last transaction:
414
+ $-1.00
415
+ """
416
+
417
+ Scenario: I see my last two transactions
418
+ Given today I have spent $1.00
419
+ And today I have spent $2.00
420
+ When the background job runs
421
+ And I open the email
422
+ Then I should see in the email:
423
+ """
424
+ Last 2 transactions:
425
+ $-2.00
426
+ $-1.00
427
+ """
428
+
429
+ Scenario: I see my last five transactions
430
+ Given today I have spent $1.00
431
+ And today I have spent $2.00
432
+ And today I have spent $3.00
433
+ And today I have spent $4.00
434
+ And today I have spent $5.00
435
+ And today I have spent $6.00
436
+ When the background job runs
437
+ And I open the email
438
+ Then I should see in the email:
439
+ """
440
+ Last 5 transactions:
441
+ $-6.00
442
+ $-5.00
443
+ $-4.00
444
+ $-3.00
445
+ $-2.00
446
+ """
@@ -0,0 +1,59 @@
1
+ Feature: Receive email
2
+
3
+ As a user
4
+ I want to receive a budget email
5
+ In order to read a budget email
6
+
7
+ Background:
8
+ Given my email queue is empty
9
+
10
+ Scenario: I receive a budget email after creating an account
11
+ Given I have not created an account
12
+ When I visit the front page
13
+ And I submit a valid form
14
+ And the background job runs
15
+ Then I should receive an email
16
+
17
+ Scenario: I receive a budget email after updating an account
18
+ Given I have created an account
19
+ When I visit the front page
20
+ And I submit a valid form
21
+ And the background job runs
22
+ Then I should receive an email
23
+
24
+ Scenario: I receive a budget email at midnight
25
+ Given I have created an account
26
+ And it is midnight
27
+ When the background job runs
28
+ Then I should receive an email
29
+
30
+ Scenario: I receive a budget email at midnight having added a transaction today
31
+ Given I have created an account
32
+ And today I have spent $1.00
33
+ And the background job ran
34
+ And my email queue is empty
35
+ And it is midnight
36
+ When the background job runs
37
+ Then I should receive an email
38
+ And spent today should be zero
39
+
40
+ Scenario: I receive a budget email at the end of the month
41
+ Given today is June 1, 2009
42
+ And I have created an account
43
+ And today I have spent $1.00
44
+ And today is July 1, 2009
45
+ And it is midnight
46
+ When the background job runs
47
+ And I open the email
48
+ Then spent today should be zero
49
+ And I should see in the email:
50
+ """
51
+ You need to earn $0.03 today.
52
+ """
53
+ # tests User#temporary_spending_cut
54
+ And I should see in the email:
55
+ """
56
+ Fiscal month: 07/01/09 to 08/01/09
57
+ """
58
+ And output the email
59
+
@@ -0,0 +1,52 @@
1
+ Given /^(?:my email queue is empty|no emails have been sent)$/ do
2
+ reset_mailer
3
+ end
4
+
5
+ When /^I open the email$/ do
6
+ open_email(current_email_address)
7
+ end
8
+
9
+ When %r{^I follow "([^"]*?)" in the email$} do |link|
10
+ visit_in_email(link)
11
+ end
12
+
13
+ Then /^I should receive (an|\d+) emails?$/ do |amount|
14
+ amount = 1 if amount == "an"
15
+ unread_emails_for(current_email_address).size.should == amount.to_i
16
+ end
17
+
18
+ Then %r{^"([^"]*?)" should receive (\d+) emails?$} do |address, n|
19
+ unread_emails_for(address).size.should == n.to_i
20
+ end
21
+
22
+ Then %r{^"([^"]*?)" should have (\d+) emails?$} do |address, n|
23
+ mailbox_for(address).size.should == n.to_i
24
+ end
25
+
26
+ Then %r{^"([^"]*?)" should not receive an email$} do |address|
27
+ find_email(address).should be_nil
28
+ end
29
+
30
+ Then %r{^I should see "([^"]*?)" in the subject$} do |text|
31
+ current_email.should have_subject(Regexp.new(Regexp.escape(text).gsub("\\n", "\n")))
32
+ end
33
+
34
+ Then %r{^I should see in the email:$} do |text|
35
+ current_email.body.should =~ Regexp.new(Regexp.escape(text).gsub("\\n", "\n"))
36
+ end
37
+
38
+ Then %r{^I should see "([^"]*?)" in the email$} do |text|
39
+ current_email.body.should =~ Regexp.new(Regexp.escape(text).gsub("\\n", "\n"))
40
+ end
41
+
42
+ When %r{^"([^"]*?)" opens? the email with subject "([^"]*?)"$} do |address, subject|
43
+ open_email(address, :with_subject => subject)
44
+ end
45
+
46
+ When %r{^"([^"]*?)" opens? the email with text "([^"]*?)"$} do |address, text|
47
+ open_email(address, :with_text => text)
48
+ end
49
+
50
+ When /^I click the first link in the email$/ do
51
+ click_first_link_in_email
52
+ end
@@ -0,0 +1,60 @@
1
+ Given /^I have created an account$/ do
2
+ $db.migrate_reset
3
+ When "I visit the front page"
4
+ When "I submit a valid form"
5
+ end
6
+
7
+ Given /^I have not created an account$/ do
8
+ User.delete_all
9
+ UserEmail.delete_all
10
+ end
11
+
12
+ Given /^it is midnight$/ do
13
+ now = Time.now.utc
14
+ today_at_12 = DateTime.strptime(
15
+ now.strftime("%m/%d/%Y 12:00 AM %Z"),
16
+ "%m/%d/%Y %I:%M %p %Z"
17
+ ).to_time
18
+ Time.stub!(:now).and_return(today_at_12)
19
+ end
20
+
21
+ Given /^I have created an account with these attributes:$/ do |table|
22
+ $db.migrate_reset
23
+ When "I visit the front page"
24
+ fill_all_with_valid_data(table.hashes.first)
25
+ click_button
26
+ end
27
+
28
+ Given /^today is (.+)$/ do |date|
29
+ now = DateTime.strptime(
30
+ "#{date} #{Time.now.utc.strftime("%H:%M:%S %Z")}",
31
+ "%B %d, %Y %H:%M:%S %Z"
32
+ ).to_time
33
+ Time.stub!(:now).and_return(now)
34
+ end
35
+
36
+ Given /^it is day (.+)$/ do |day|
37
+ day = day.to_i
38
+ user = find_user
39
+ # Email already sent today
40
+ user.update_attribute(:send_at, user.send_at + day.days)
41
+ Time.stub!(:now).and_return(user.reset_at - 1.month + (day - 1).days)
42
+ end
43
+
44
+ Given /^today I have spent \$(.+)$/ do |amount|
45
+ IncomingMail.receive(generate_email(:subject => amount))
46
+ end
47
+
48
+ Given /^before today I spent \$(.+)$/ do |amount|
49
+ user = find_user
50
+ user.spent_this_month += amount.to_f
51
+ user.save
52
+ end
53
+
54
+ Given /^I have deposited \$(.+)$/ do |amount|
55
+ IncomingMail.receive(generate_email(:subject => "+#{amount}"))
56
+ end
57
+
58
+ Given /^the background job ran$/ do
59
+ When "the background job runs"
60
+ end
@@ -0,0 +1,32 @@
1
+ Then /^I should see a form$/ do
2
+ assert_have_selector "form[action='/new'][method='post']"
3
+ end
4
+
5
+ Then /^I should see a.? (.+) text field$/ do |field|
6
+ assert_have_selector "#user_#{field}"
7
+ end
8
+
9
+ Then /^I should see a submit button$/ do
10
+ assert_have_selector "input[type=image]"
11
+ end
12
+
13
+ Then /^I should see a success page$/ do
14
+ within "h1" do
15
+ assert_contain "Success!"
16
+ end
17
+ end
18
+
19
+ Then /^the (.+) field should have an error$/ do |field|
20
+ assert_have_selector "#user_#{field}"
21
+ assert_have_selector ".validation"
22
+ end
23
+
24
+ Then /^the error should be "([^\"]*)"$/ do |error|
25
+ within ".validation" do
26
+ assert_contain error
27
+ end
28
+ end
29
+
30
+ Then /^spent today should be zero$/ do
31
+ find_user.spent_today.should == 0
32
+ end
@@ -0,0 +1,41 @@
1
+ When /^I visit the front page$/ do
2
+ visit '/'
3
+ end
4
+
5
+ When /^I submit a valid form$/ do
6
+ fill_all_with_valid_data
7
+ click_button
8
+ end
9
+
10
+ When /^I submit a valid form with (.+)$/ do |input|
11
+ fill_all_with_valid_data
12
+ values = case input
13
+ when "decimals": [ "1000.00", "5000.00", "2000.00" ]
14
+ when "numbers only": [ "1000", "5000", "2000" ]
15
+ when "dollar signs": [ "$1000.00", "$5000.00", "$2000.00" ]
16
+ end
17
+ fill_in "user[savings]", :with => values.pop
18
+ fill_in "user[income]", :with => values.pop
19
+ fill_in "user[bills]", :with => values.pop
20
+ click_button
21
+ end
22
+
23
+ When /^submit an invalid (.+)$/ do |field|
24
+ fill_all_with_valid_data
25
+ fill_in "user[#{field.split.first}]", :with => "invalid"
26
+ click_button
27
+ end
28
+
29
+ When /^submit an empty (.+)$/ do |field|
30
+ fill_all_with_valid_data
31
+ fill_in "user[#{field.split.first}]", :with => ""
32
+ click_button
33
+ end
34
+
35
+ When /^the background job runs$/ do
36
+ visit '/cron'
37
+ end
38
+
39
+ When /^output the email$/ do
40
+ puts current_email.body
41
+ end