open_porch 0.5.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 (223) hide show
  1. data/Gemfile +41 -0
  2. data/Gemfile.lock +130 -0
  3. data/README.md +170 -0
  4. data/Rakefile +19 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/admin/areas/base_controller.rb +11 -0
  7. data/app/controllers/admin/areas/issues_controller.rb +67 -0
  8. data/app/controllers/admin/areas/memberships_controller.rb +7 -0
  9. data/app/controllers/admin/areas/posts_controller.rb +44 -0
  10. data/app/controllers/admin/areas_controller.rb +89 -0
  11. data/app/controllers/admin/base_controller.rb +16 -0
  12. data/app/controllers/admin/user_activity_controller.rb +29 -0
  13. data/app/controllers/admin/users_controller.rb +57 -0
  14. data/app/controllers/application_controller.rb +15 -0
  15. data/app/controllers/areas/base_controller.rb +25 -0
  16. data/app/controllers/areas/issues_controller.rb +35 -0
  17. data/app/controllers/areas/posts_controller.rb +28 -0
  18. data/app/controllers/areas_controller.rb +30 -0
  19. data/app/controllers/passwords_controller.rb +42 -0
  20. data/app/controllers/registrations_controller.rb +42 -0
  21. data/app/controllers/sessions_controller.rb +33 -0
  22. data/app/controllers/users_controller.rb +77 -0
  23. data/app/helpers/open_porch_helper.rb +24 -0
  24. data/app/mailers/user_mailer.rb +35 -0
  25. data/app/models/address.rb +57 -0
  26. data/app/models/area.rb +171 -0
  27. data/app/models/area_activity.rb +24 -0
  28. data/app/models/email_message.rb +104 -0
  29. data/app/models/issue.rb +66 -0
  30. data/app/models/issue_number.rb +22 -0
  31. data/app/models/membership.rb +27 -0
  32. data/app/models/post.rb +64 -0
  33. data/app/models/session_user.rb +69 -0
  34. data/app/models/user.rb +140 -0
  35. data/app/models/user_activity.rb +31 -0
  36. data/app/models/user_authority_check.rb +14 -0
  37. data/app/views/admin/areas/_form.html.haml +8 -0
  38. data/app/views/admin/areas/_nav.html.haml +12 -0
  39. data/app/views/admin/areas/edit.html.haml +22 -0
  40. data/app/views/admin/areas/edit_borders.html.haml +44 -0
  41. data/app/views/admin/areas/index.html.haml +61 -0
  42. data/app/views/admin/areas/issues/_post.html.haml +15 -0
  43. data/app/views/admin/areas/issues/add_posts.js.rjs +3 -0
  44. data/app/views/admin/areas/issues/edit.html.haml +37 -0
  45. data/app/views/admin/areas/issues/index.html.haml +31 -0
  46. data/app/views/admin/areas/issues/remove_posts.js.rjs +3 -0
  47. data/app/views/admin/areas/issues/show.html.haml +13 -0
  48. data/app/views/admin/areas/memberships/index.html.haml +17 -0
  49. data/app/views/admin/areas/new.html.haml +6 -0
  50. data/app/views/admin/areas/new.js.haml +4 -0
  51. data/app/views/admin/areas/posts/_edit.html.haml +6 -0
  52. data/app/views/admin/areas/posts/_post_status.html.haml +1 -0
  53. data/app/views/admin/areas/posts/destroy.js.rjs +1 -0
  54. data/app/views/admin/areas/posts/edit.js.rjs +1 -0
  55. data/app/views/admin/areas/posts/show.js.rjs +1 -0
  56. data/app/views/admin/areas/posts/toggle_reviewed_by.js.rjs +1 -0
  57. data/app/views/admin/areas/posts/update.js.rjs +5 -0
  58. data/app/views/admin/areas/show.html.haml +5 -0
  59. data/app/views/admin/user_activity/show.html.haml +5 -0
  60. data/app/views/admin/users/_form.html.haml +21 -0
  61. data/app/views/admin/users/edit.html.haml +5 -0
  62. data/app/views/admin/users/index.html.haml +31 -0
  63. data/app/views/admin/users/new.html.haml +5 -0
  64. data/app/views/areas/issues/index.html.haml +31 -0
  65. data/app/views/areas/issues/show.html.haml +22 -0
  66. data/app/views/areas/posts/_post.html.haml +8 -0
  67. data/app/views/areas/posts/_posts_search_form.html.haml +8 -0
  68. data/app/views/areas/posts/index.html.haml +27 -0
  69. data/app/views/areas/posts/new.html.haml +10 -0
  70. data/app/views/areas/show.html.haml +47 -0
  71. data/app/views/layouts/_account_nav.html.haml +18 -0
  72. data/app/views/layouts/_flash_message.html.haml +4 -0
  73. data/app/views/layouts/_footer.html.haml +9 -0
  74. data/app/views/layouts/_head.html.haml +16 -0
  75. data/app/views/layouts/admin/_nav.html.haml +13 -0
  76. data/app/views/layouts/admin.html.haml +15 -0
  77. data/app/views/layouts/application.html.haml +14 -0
  78. data/app/views/layouts/area_editor.html.haml +11 -0
  79. data/app/views/passwords/edit.html.haml +9 -0
  80. data/app/views/passwords/new.html.haml +13 -0
  81. data/app/views/registrations/_address_form.html.haml +7 -0
  82. data/app/views/registrations/create.html.haml +49 -0
  83. data/app/views/registrations/index.html.haml +30 -0
  84. data/app/views/registrations/new.html.haml +17 -0
  85. data/app/views/sessions/new.html.haml +18 -0
  86. data/app/views/stylesheets/common.sass +239 -0
  87. data/app/views/stylesheets/content.sass +193 -0
  88. data/app/views/stylesheets/reset.sass +46 -0
  89. data/app/views/stylesheets/structure.sass +11 -0
  90. data/app/views/stylesheets/typography.sass +57 -0
  91. data/app/views/user_mailer/email_verification.html.erb +5 -0
  92. data/app/views/user_mailer/email_verification.text.erb +7 -0
  93. data/app/views/user_mailer/new_issue.html.erb +32 -0
  94. data/app/views/user_mailer/new_issue.text.erb +26 -0
  95. data/app/views/user_mailer/password_reset.html.erb +7 -0
  96. data/app/views/user_mailer/password_reset.text.erb +6 -0
  97. data/app/views/users/_form.html.haml +5 -0
  98. data/app/views/users/edit.html.haml +11 -0
  99. data/app/views/users/new.html.haml +41 -0
  100. data/app/views/users/show.html.haml +30 -0
  101. data/bin/open_porch_engine +135 -0
  102. data/config/application.rb +43 -0
  103. data/config/boot.rb +13 -0
  104. data/config/database_example.yml +59 -0
  105. data/config/environment.rb +5 -0
  106. data/config/environments/development.rb +26 -0
  107. data/config/environments/production.rb +49 -0
  108. data/config/environments/test.rb +35 -0
  109. data/config/initializers/backtrace_silencers.rb +7 -0
  110. data/config/initializers/email_regex.rb +38 -0
  111. data/config/initializers/geokit_config.rb +61 -0
  112. data/config/initializers/inflections.rb +20 -0
  113. data/config/initializers/meta_search.rb +7 -0
  114. data/config/initializers/mime_types.rb +5 -0
  115. data/config/initializers/open_porch.rb +41 -0
  116. data/config/initializers/sass.rb +1 -0
  117. data/config/initializers/secret_token.rb +7 -0
  118. data/config/initializers/session_store.rb +8 -0
  119. data/config/initializers/states_provinces.rb +2 -0
  120. data/config/initializers/will_paginate.rb +2 -0
  121. data/config/locales/en.yml +5 -0
  122. data/config/open_porch_example.yml +23 -0
  123. data/config/routes.rb +54 -0
  124. data/config/schedule.rb +9 -0
  125. data/config.ru +4 -0
  126. data/db/migrate/01_create_areas.rb +21 -0
  127. data/db/migrate/02_create_users.rb +28 -0
  128. data/db/migrate/03_create_memberships.rb +14 -0
  129. data/db/migrate/04_create_posts.rb +20 -0
  130. data/db/migrate/05_create_issue_numbers.rb +13 -0
  131. data/db/migrate/06_create_issues.rb +21 -0
  132. data/db/migrate/20110204173301_add_published_to_areas.rb +10 -0
  133. data/db/migrate/20110204194840_create_user_activities.rb +13 -0
  134. data/db/migrate/20110208163604_add_zip_to_areas.rb +11 -0
  135. data/db/migrate/20110209175723_add_counters_to_areas.rb +11 -0
  136. data/db/migrate/20110209182244_remove_subject_from_issues.rb +9 -0
  137. data/db/migrate/20110209190146_add_reviewer_info_to_posts.rb +9 -0
  138. data/db/migrate/20110215173144_add_email_validation_key_to_users.rb +13 -0
  139. data/db/migrate/20110215182716_remove_published_from_areas.rb +10 -0
  140. data/db/migrate/20110215211012_create_area_activities.rb +19 -0
  141. data/db/migrate/20110215213802_create_email_messages.rb +19 -0
  142. data/db/migrate/20110217165018_change_send_mode_to_string.rb +17 -0
  143. data/db/migrate/20110223160609_denormalize_user_info_in_posts.rb +19 -0
  144. data/db/seeds.rb +7 -0
  145. data/doc/README_FOR_APP +2 -0
  146. data/lib/generators/open_porch_generator.rb +37 -0
  147. data/lib/open_porch/engine.rb +20 -0
  148. data/lib/open_porch.rb +3 -0
  149. data/lib/tasks/.gitkeep +0 -0
  150. data/lib/tasks/open_porch.rake +10 -0
  151. data/lib/tasks/postageapp_tasks.rake +78 -0
  152. data/open_porch.gemspec +335 -0
  153. data/public/404.html +26 -0
  154. data/public/422.html +26 -0
  155. data/public/500.html +26 -0
  156. data/public/favicon.ico +0 -0
  157. data/public/images/icons/ajax-loader.gif +0 -0
  158. data/public/images/icons/calendar.png +0 -0
  159. data/public/images/icons/post_new.png +0 -0
  160. data/public/images/icons/post_reviewed.png +0 -0
  161. data/public/javascripts/application.js +3 -0
  162. data/public/javascripts/google_maps.js +153 -0
  163. data/public/javascripts/highcharts.js +162 -0
  164. data/public/javascripts/highcharts_init.js +30 -0
  165. data/public/javascripts/issue_edit.js +57 -0
  166. data/public/javascripts/jquery-ui.min.js +191 -0
  167. data/public/javascripts/jquery.js +154 -0
  168. data/public/javascripts/rails.js +137 -0
  169. data/public/javascripts/region_editor.js +616 -0
  170. data/public/javascripts/user_activity.js +29 -0
  171. data/public/robots.txt +5 -0
  172. data/public/stylesheets/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  173. data/public/stylesheets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  174. data/public/stylesheets/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  175. data/public/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  176. data/public/stylesheets/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  177. data/public/stylesheets/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  178. data/public/stylesheets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  179. data/public/stylesheets/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  180. data/public/stylesheets/images/ui-icons_222222_256x240.png +0 -0
  181. data/public/stylesheets/images/ui-icons_2e83ff_256x240.png +0 -0
  182. data/public/stylesheets/images/ui-icons_454545_256x240.png +0 -0
  183. data/public/stylesheets/images/ui-icons_888888_256x240.png +0 -0
  184. data/public/stylesheets/images/ui-icons_cd0a0a_256x240.png +0 -0
  185. data/public/stylesheets/jquery-ui.css +362 -0
  186. data/script/rails +6 -0
  187. data/test/dummy/area.rb +5 -0
  188. data/test/dummy/area_activity.rb +7 -0
  189. data/test/dummy/issue.rb +4 -0
  190. data/test/dummy/membership.rb +4 -0
  191. data/test/dummy/post.rb +12 -0
  192. data/test/dummy/user.rb +29 -0
  193. data/test/dummy/user_activity.rb +11 -0
  194. data/test/functional/admin/areas/issues_controller_test.rb +48 -0
  195. data/test/functional/admin/areas/memberships_controller_test.rb +45 -0
  196. data/test/functional/admin/areas/posts_controller_test.rb +54 -0
  197. data/test/functional/admin/areas_controller_test.rb +134 -0
  198. data/test/functional/admin/base_controller_test.rb +8 -0
  199. data/test/functional/admin/user_activity_controller_test.rb +28 -0
  200. data/test/functional/admin/users_controller_test.rb +144 -0
  201. data/test/functional/areas/issues_controller_test.rb +33 -0
  202. data/test/functional/areas/posts_controller_test.rb +50 -0
  203. data/test/functional/areas_controller_test.rb +12 -0
  204. data/test/functional/passwords_controller_test.rb +64 -0
  205. data/test/functional/registrations_controller_test.rb +64 -0
  206. data/test/functional/sessions_controller_test.rb +120 -0
  207. data/test/functional/users_controller_test.rb +144 -0
  208. data/test/performance/browsing_test.rb +9 -0
  209. data/test/test_helper.rb +92 -0
  210. data/test/unit/address_test.rb +25 -0
  211. data/test/unit/area_activity_test.rb +57 -0
  212. data/test/unit/area_test.rb +92 -0
  213. data/test/unit/email_message_test.rb +8 -0
  214. data/test/unit/issue_number_test.rb +25 -0
  215. data/test/unit/issue_test.rb +154 -0
  216. data/test/unit/membership_test.rb +20 -0
  217. data/test/unit/post_test.rb +69 -0
  218. data/test/unit/session_user_test.rb +65 -0
  219. data/test/unit/user_activity_test.rb +31 -0
  220. data/test/unit/user_mailer_test.rb +20 -0
  221. data/test/unit/user_test.rb +61 -0
  222. data/vendor/plugins/.gitkeep +0 -0
  223. metadata +456 -0
@@ -0,0 +1,144 @@
1
+ require 'test_helper'
2
+
3
+ class UsersControllerTest < ActionController::TestCase
4
+ def setup
5
+ @area = Area.create_dummy(
6
+ :name => 'Oakledge',
7
+ :border => Polygon.from_coordinates([[
8
+ [44.450713, -73.227265],
9
+ [44.456838, -73.225943],
10
+ [44.455921, -73.218375],
11
+ [44.449365, -73.220694],
12
+ [44.450713, -73.227265]
13
+ ]])
14
+ )
15
+ end
16
+
17
+ def test_new_with_no_address
18
+ get :new
19
+ assert_redirected_to root_path
20
+ end
21
+
22
+ def test_new
23
+ get :new, :user => {
24
+ :address=>"123 Fake St",
25
+ :city=>"Burlington",
26
+ :state=>"Vermont",
27
+ :memberships_attributes=>{"0"=>{:area_id => @area.id}}
28
+ }
29
+ assert_response :success
30
+ assert_template 'new'
31
+ assert_equal assigns(:area), @area
32
+ end
33
+
34
+ def test_create
35
+ assert_difference ['User.count', 'Membership.count'] do
36
+ assert_emails 1 do
37
+ post :create, :user => {
38
+ :email => 'user@example.com',
39
+ :password => 'tester',
40
+ :password_confirmation => 'tester',
41
+ :address=>"123 Fake St",
42
+ :city=>"Burlington",
43
+ :state=>"Vermont",
44
+ :first_name => 'John',
45
+ :last_name => 'Tester',
46
+ :memberships_attributes=>{"0"=>{:area_id => @area.id}}
47
+ }
48
+ assert_redirected_to root_path
49
+ assert_equal 'Thank you, please check your email to complete the registration.', flash[:notice]
50
+ assert !@controller.logged_in?
51
+ assert_not_nil assigns(:user).email_verification_key
52
+ assert !assigns(:user).is_verified?
53
+ end
54
+ end
55
+ response = ActionMailer::Base.deliveries.last
56
+ assert_equal 2, response.arguments['content'].length
57
+ response.arguments['content'].each do |content_type, body|
58
+ assert_match assigns(:user).email_verification_key, body
59
+ end
60
+ assert_equal assigns(:user).email, response.to[0]
61
+
62
+ end
63
+
64
+ def test_create_fails
65
+ assert_no_difference ['User.count', 'Membership.count'] do
66
+ post :create, :user => {}
67
+ assert_redirected_to root_path
68
+ end
69
+ end
70
+
71
+ def test_email_verification
72
+ user = a User
73
+ assert_created user
74
+ assert !user.is_verified?
75
+
76
+ area = an Area
77
+ assert_created area
78
+
79
+ user.areas << area
80
+ assert_equal area, user.areas.first
81
+
82
+ user.set_email_verification_key
83
+ user.save!
84
+ assert !user.is_verified?
85
+
86
+ get :verify_email, :email_verification_key => user.email_verification_key
87
+ assert_equal 'Your email address has been verified. You can now login', flash[:notice]
88
+ assert !@controller.logged_in?
89
+ assert_redirected_to login_path
90
+ user.reload
91
+ assert user.is_verified?
92
+ end
93
+
94
+ def test_failed_email_verification
95
+ user = a User
96
+ assert_created user
97
+ assert !user.is_verified?
98
+
99
+ area = an Area
100
+ assert_created area
101
+
102
+ user.areas << area
103
+ assert_equal area, user.areas.first
104
+
105
+ user.set_email_verification_key
106
+ user.save!
107
+ assert !user.is_verified?
108
+
109
+ get :verify_email, :email_verification_key => 'bogus'
110
+ assert_equal 'We were not able to verify your account. Please contact us for assistance.', flash[:alert]
111
+ assert !@controller.logged_in?
112
+ user.reload
113
+ assert !user.is_verified?
114
+ assert_redirected_to root_path
115
+ end
116
+
117
+ def test_resend_email_verification
118
+ user = a User
119
+ assert_created user
120
+ user.set_email_verification_key
121
+ user.save!
122
+ assert !user.is_verified?
123
+
124
+ assert_emails 1 do
125
+ get :resend_email_verification, :email_verification_key => user.email_verification_key
126
+ assert_redirected_to login_path
127
+ response = ActionMailer::Base.deliveries.last
128
+ assert_equal 2, response.arguments['content'].length
129
+ response.arguments['content'].each do |content_type, body|
130
+ assert_match assigns(:user).email_verification_key, body
131
+ end
132
+ assert_equal assigns(:user).email, response.to[0]
133
+ end
134
+ end
135
+
136
+ def test_destroy
137
+ login_as(:regular_user)
138
+ assert_difference 'User.count', -1 do
139
+ delete :destroy
140
+ end
141
+ assert_equal "Your account has been deleted.", flash[:alert]
142
+ assert_redirected_to root_path
143
+ end
144
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+ require 'rails/performance_test_help'
3
+
4
+ # Profiling results for each test method are written to tmp/performance.
5
+ class BrowsingTest < ActionDispatch::PerformanceTest
6
+ def test_homepage
7
+ get '/'
8
+ end
9
+ end
@@ -0,0 +1,92 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ self.use_transactional_fixtures = true
7
+ self.use_instantiated_fixtures = false
8
+ include ActionMailer::TestHelper
9
+
10
+ def data_path(name)
11
+ File.expand_path(File.join('test', 'data', name), Rails.root)
12
+ end
13
+
14
+ def assert_created(model)
15
+ assert model
16
+ assert_equal [ ], model.errors.full_messages
17
+ assert model.valid?
18
+ assert !model.new_record?
19
+ end
20
+
21
+ def assert_not_created(model)
22
+ assert model
23
+ assert model.new_record?
24
+ end
25
+
26
+ def assert_errors_on(model, *attrs)
27
+ found_attrs = [ ]
28
+
29
+ model.errors.each do |attr, error|
30
+ found_attrs << attr
31
+ end
32
+
33
+ assert_equal attrs.flatten.collect(&:to_s).sort, found_attrs.uniq.collect(&:to_s).sort
34
+ end
35
+
36
+ def assert_mapping(map, &block)
37
+ result_map = map.inject({ }) do |h, (k,v)|
38
+ h[k] = yield(k)
39
+ h
40
+ end
41
+
42
+ differences = result_map.inject([ ]) do |a, (k,v)|
43
+ if (v != map[k])
44
+ a << k
45
+ end
46
+ a
47
+ end
48
+ assert_equal map, result_map, "Difference: #{map.slice(*differences).inspect} vs #{result_map.slice(*differences).inspect}"
49
+ end
50
+
51
+ def login_as(obj)
52
+ case obj
53
+ when String
54
+ user = a User
55
+ user.update_attribute(:role, obj)
56
+ when Symbol
57
+ user = a User
58
+ user.update_attribute(:role, obj.to_s)
59
+ when User
60
+ user = obj
61
+ else
62
+ raise "Please specifuy either a User or a role: #{obj.class.to_s}"
63
+ end
64
+
65
+ session[:user_id] = user.id
66
+ token = Wristband::Support.encrypt_with_salt(user.id.to_s, Time.now.to_f.to_s)
67
+ cookies[:login_token] = {
68
+ :value => token,
69
+ :expires => 2.weeks.from_now.utc
70
+ }
71
+
72
+ user
73
+ end
74
+
75
+ def assert_exception_raised(exception_class = nil, error_message = nil, &block)
76
+ exception_raised = nil
77
+ yield
78
+ rescue => exception_raised
79
+ ensure
80
+ if exception_raised
81
+ if exception_class
82
+ assert_equal exception_class, exception_raised.class, exception_raised.to_s
83
+ else
84
+ assert true
85
+ end
86
+ assert_equal error_message, exception_raised.to_s if error_message
87
+ else
88
+ flunk 'Exception was not raised'
89
+ end
90
+ end
91
+
92
+ end
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+
3
+ class AddressTest < ActiveSupport::TestCase
4
+
5
+ def test_create_defaults
6
+ address = Address.new(
7
+ :address => '123 Fake St',
8
+ :city => 'Burlington',
9
+ :state => 'Vermont'
10
+ )
11
+ assert address.valid?
12
+ assert_equal address.address, '123 Fake St'
13
+ assert_equal address.city, 'Burlington'
14
+ assert_equal address.state, 'Vermont'
15
+ end
16
+
17
+ def test_create_requirements
18
+ address = Address.new
19
+ assert !address.valid?
20
+ assert_errors_on address, :address, :city, :state
21
+ assert address.errors[:address].include?("Please enter your address")
22
+ assert address.errors[:city].include?("Please enter your address")
23
+ assert address.errors[:state].include?("Please enter your address")
24
+ end
25
+ end
@@ -0,0 +1,57 @@
1
+ require 'test_helper'
2
+
3
+ class AreaActivityTest < ActiveSupport::TestCase
4
+
5
+ def test_create_dummy
6
+ activity = an AreaActivity
7
+ assert_created activity
8
+ end
9
+
10
+ def test_activity_tracking_for_memberships
11
+ # Memberships
12
+ assert_difference 'AreaActivity.count', 1 do
13
+ @membership = Membership.create_dummy
14
+ assert_equal 1, @membership.area.activities.first.new_users_count
15
+ end
16
+ assert_no_difference 'AreaActivity.count' do
17
+ @membership.destroy
18
+ assert_equal 1, @membership.area.activities.first.quitters_count
19
+ end
20
+ end
21
+
22
+ def test_activity_tracking_for_posts
23
+ # Posts
24
+ assert_difference ['Post.count', 'AreaActivity.count'], 1 do
25
+ post = Post.create_dummy
26
+ assert_equal 1, post.area.activities.first.new_posts_count
27
+ end
28
+ end
29
+
30
+ def test_activity_tracking_for_issues
31
+ # Create an area
32
+ area = an Area
33
+ assert_created area
34
+ assert area.send_mode?(:immediate)
35
+
36
+ # Create en issue
37
+ assert_difference ['Post.count', 'Issue.count', 'AreaActivity.count'], 1 do
38
+ assert_emails 1 do
39
+ post = area.posts.create_dummy
40
+ assert_created post
41
+ assert_nil area.current_issue
42
+ assert_equal 1, area.activities.first.issues_published_count
43
+ end
44
+ end
45
+ end
46
+
47
+ def test_activity_tracking_for_nonexistent_field
48
+ area = an Area
49
+ assert_created area
50
+ assert_exception_raised nil, "Cannot find field in the list of trackable fields. Currently tracking: #{AreaActivity::TRACKABLE.join(', ')}" do
51
+ assert_no_difference 'AreaActivity.count' do
52
+ area.record_activity_for!(:blah)
53
+ end
54
+ end
55
+ end
56
+
57
+ end
@@ -0,0 +1,92 @@
1
+ require 'test_helper'
2
+
3
+ class AreaTest < ActiveSupport::TestCase
4
+
5
+ def test_create_defaults
6
+ area = Area.create(
7
+ :name => 'Test Area'
8
+ )
9
+ assert_created area
10
+ assert_equal 'immediate', area.send_mode
11
+ end
12
+
13
+ def test_create_requirements
14
+ area = Area.create
15
+ assert_errors_on area, :name
16
+ Area.create(:name => 'Test NF', :slug => 'test-nf')
17
+ assert_no_difference 'Area.count' do
18
+ ['test-nf', 'test nf', 'test#NF'].each do |slug|
19
+ area = Area.create(:name => 'Test NF 2', :slug => slug)
20
+ assert_errors_on area, :slug
21
+ end
22
+ end
23
+ end
24
+
25
+ def test_create_dummy
26
+ area = an Area
27
+ assert_created area
28
+ end
29
+
30
+ def test_cascade_deletions
31
+ area = an Area
32
+ assert_created area
33
+ membership = area.memberships.create_dummy
34
+ assert_created membership
35
+ post = area.posts.create_dummy
36
+ assert_created post
37
+ # Note: Creating a membership and post will also create an AreaActivity,
38
+ # so no need to create that separately.
39
+ area.reload
40
+ assert_difference ['Area.count', 'Membership.count', 'Post.count', 'Issue.count', 'AreaActivity.count'], -1 do
41
+ area.destroy
42
+ end
43
+ end
44
+
45
+ def test_record_activity_for
46
+ area = an Area
47
+ assert_equal 0, area.activities.count
48
+ assert_difference 'AreaActivity.count', 1 do
49
+ activity = area.record_activity_for!(:quitters)
50
+ assert_equal 1, activity.quitters_count
51
+ end
52
+ assert_no_difference 'AreaActivity.count' do
53
+ activity = area.record_activity_for!(:quitters)
54
+ assert_equal 2, activity.quitters_count
55
+ end
56
+ end
57
+
58
+ def test_check_send_mode_change
59
+ area = Area.create_dummy(:send_mode => 'batched')
60
+ assert_created area
61
+ assert area.send_mode?(:batched)
62
+
63
+ posts = []
64
+ # Create 5 posts
65
+ assert_difference 'Post.count', 5 do
66
+ assert_difference 'Issue.count' do
67
+ assert_emails 0 do
68
+ 1.upto(5){ posts << area.posts.create_dummy }
69
+ end
70
+ end
71
+ end
72
+ assert_not_nil area.current_issue
73
+ assert area.current_issue.posts.empty?
74
+
75
+ # Assign the first 2 posts to the current issue
76
+ 0.upto(1){ |i| posts[i].update_attribute(:issue_id, area.current_issue.id) }
77
+ area.current_issue.reload
78
+ assert_equal 2, area.current_issue.posts.length
79
+
80
+
81
+ assert_no_difference 'Post.count' do
82
+ assert_difference 'Issue.count', 4 do
83
+ assert_emails 5 do
84
+ area.send_mode = 'immediate'
85
+ area.save!
86
+ assert area.send_mode?(:immediate)
87
+ assert_nil area.current_issue
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+
3
+ class EmailMessageTest < ActiveSupport::TestCase
4
+ # Replace this with your real tests.
5
+ test "the truth" do
6
+ assert true
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+
3
+ class IssueNumberTest < ActiveSupport::TestCase
4
+ def test_defaults
5
+ assert_difference ['Area.count', 'IssueNumber.count'] do
6
+ area = an Area
7
+ assert_created area
8
+ assert_created area.issue_number
9
+
10
+ assert_equal 0, area.issue_number.current
11
+ assert_equal 1, area.issue_number.next
12
+ assert_equal 1, area.issue_number.current
13
+ assert_equal 2, area.issue_number.next
14
+ assert_equal 2, area.issue_number.current
15
+ end
16
+ end
17
+
18
+ def test_cascade_deletions
19
+ area = an Area
20
+ assert_difference ['Area.count', 'IssueNumber.count'], -1 do
21
+ area.destroy
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,154 @@
1
+ require 'test_helper'
2
+
3
+ class IssueTest < ActiveSupport::TestCase
4
+
5
+ def test_create_defaults
6
+ area = an Area
7
+ issue = Issue.create(
8
+ :area => area,
9
+ :scheduled_at => 2.days.from_now
10
+ )
11
+ assert_equal 1, issue.number
12
+ assert_created issue
13
+ end
14
+
15
+ def test_create_requirements
16
+ issue = Issue.create(:scheduled_at => 2.days.ago)
17
+ assert_errors_on issue, :area_id, :scheduled_at
18
+ assert issue.errors[:scheduled_at].include?("can't be in the past.")
19
+ end
20
+
21
+ def test_create_dummy
22
+ issue = an Issue
23
+ assert_created issue
24
+ end
25
+
26
+ def test_cascade_deletions
27
+ post = a Post
28
+ assert_created post
29
+ assert post.issue.is_a?(Issue)
30
+ post.reload
31
+ assert_difference ['Post.count', 'Issue.count'], -1 do
32
+ post.issue.destroy
33
+ end
34
+ end
35
+
36
+ def test_send_in_immediate_mode!
37
+ # Create an area
38
+ area = an Area
39
+ assert_created area
40
+ assert area.send_mode?(:immediate)
41
+
42
+ # Create en issue
43
+ assert_difference ['Post.count', 'Issue.count'], 1 do
44
+ assert_emails 1 do
45
+ post = area.posts.create_dummy
46
+ assert_created post
47
+ assert_nil area.current_issue
48
+ end
49
+ end
50
+ end
51
+
52
+ def test_send_in_batched_mode!
53
+ # Create an area
54
+ area = Area.create_dummy(:send_mode => 'batched')
55
+ assert_created area
56
+ assert area.send_mode?(:batched)
57
+
58
+ # Create an issue
59
+ issue = area.issues.create_dummy
60
+ assert_created issue
61
+ assert_nil issue.sent_at
62
+ assert_equal issue, area.current_issue
63
+
64
+ # Add two posts to the area
65
+ post_1 = area.posts.create_dummy
66
+ assert_created post_1
67
+ assert_equal post_1.area, area
68
+
69
+ post_2 = area.posts.create_dummy
70
+ assert_created post_2
71
+ assert_equal post_2.area, area
72
+
73
+ assert_equal [post_1, post_2], area.posts.order(:id)
74
+ assert_equal [], area.posts.in_issue(issue)
75
+ assert_equal [post_1, post_2], area.posts.in_issue(nil).order(:id)
76
+
77
+ # Add one post to the issue
78
+ post_1.update_attribute(:issue_id, issue.id)
79
+ area.reload
80
+ assert_equal [post_1], area.posts.in_issue(issue)
81
+ assert_equal [post_2], area.posts.in_issue(nil)
82
+
83
+ # Send the issue
84
+ assert_emails 1 do
85
+ # Another issue should be created
86
+ assert_difference 'Issue.count' do
87
+ issue.send!
88
+ assert issue.sent_at.is_a?(Time)
89
+ area = Area.find(area.id)
90
+ assert_not_equal issue, area.current_issue
91
+ end
92
+ end
93
+
94
+ issue = area.current_issue
95
+ assert_equal [], area.posts.in_issue(issue)
96
+ assert_equal [post_2], area.posts.in_issue(nil)
97
+
98
+ # Add the second post to the issue
99
+ post_2.update_attribute(:issue_id, issue.id)
100
+ area.reload
101
+ assert_equal [post_2], area.posts.in_issue(issue)
102
+ assert_equal [], area.posts.in_issue(nil)
103
+
104
+ # Send the second issue
105
+ assert_emails 1 do
106
+ # No new issue should be created
107
+ assert_no_difference 'Issue.count' do
108
+ issue.send!
109
+ assert issue.sent_at.is_a?(Time)
110
+ area = Area.find(area.id)
111
+ assert_nil area.current_issue
112
+ end
113
+ end
114
+ end
115
+
116
+ def test_issue_number
117
+ # Create one area
118
+ area = an Area
119
+ assert_created area
120
+
121
+ # Add an issue
122
+ issue = area.issues.create_dummy
123
+ assert_created issue
124
+ area.reload
125
+ assert_equal 1, issue.number
126
+ assert_equal 1, area.issue_number.current
127
+
128
+ # Add another issue
129
+ issue = area.issues.create_dummy
130
+ assert_created issue
131
+ area.reload
132
+ assert_equal 2, issue.number
133
+ assert_equal 2, area.issue_number.current
134
+
135
+ # Create another area
136
+ area = an Area
137
+ assert_created area
138
+
139
+ # Add an issue
140
+ issue = area.issues.create_dummy
141
+ assert_created issue
142
+ area.reload
143
+ assert_equal 1, issue.number
144
+ assert_equal 1, area.issue_number.current
145
+
146
+ # Add another issue
147
+ issue = area.issues.create_dummy
148
+ assert_created issue
149
+ area.reload
150
+ assert_equal 2, issue.number
151
+ assert_equal 2, area.issue_number.current
152
+ end
153
+
154
+ end
@@ -0,0 +1,20 @@
1
+ require 'test_helper'
2
+
3
+ class MembershipTest < ActiveSupport::TestCase
4
+
5
+ def test_validations
6
+ # Uniqueness
7
+ membership = Membership.create_dummy
8
+ assert_created membership
9
+ membership = membership.clone
10
+ membership.save
11
+ assert_not_created membership
12
+ assert membership.errors[:user_id].include?("has already been taken")
13
+ end
14
+
15
+ def test_create_dummy
16
+ membership = Membership.create_dummy
17
+ assert_created membership
18
+ end
19
+
20
+ end
@@ -0,0 +1,69 @@
1
+ require 'test_helper'
2
+
3
+ class PostTest < ActiveSupport::TestCase
4
+
5
+ def test_create_defaults
6
+ assert_difference ['Post.count', 'Issue.count'], 1 do
7
+ post = Post.create(
8
+ :title => 'Test Post',
9
+ :content => 'Lorem ipsum dolor sit amet',
10
+ :user => (a User),
11
+ :area => (an Area)
12
+ )
13
+ assert post.area.send_mode?(:immediate)
14
+ end
15
+ end
16
+
17
+ def test_create_requirements
18
+ post = Post.create
19
+ assert_errors_on post, :title, :content, :user_id, :area_id, :user_first_name,
20
+ :user_last_name, :user_email, :user_address, :user_city,
21
+ :user_state
22
+ end
23
+
24
+ def test_create_dummy
25
+ area = Area.create_dummy(:send_mode => 'batched')
26
+ assert_created area
27
+ assert area.send_mode?(:batched)
28
+ assert area.issues.empty?
29
+
30
+ # Creating the first post will also create an issue
31
+ assert_difference ['Post.count', 'Issue.count'] do
32
+ assert_emails 0 do
33
+ post = area.posts.create_dummy
34
+ assert_created post
35
+ assert_equal post.area.id, area.id
36
+ end
37
+ end
38
+
39
+ # The second post will NOT create a new issue
40
+ assert_difference 'Post.count' do
41
+ assert_no_difference 'Issue.count' do
42
+ assert_emails 0 do
43
+ post = area.posts.create_dummy
44
+ assert_created post
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ def test_send_immediatelly
51
+ area = Area.create_dummy(:send_mode => 'batched')
52
+ assert_created area
53
+ assert area.send_mode?(:batched)
54
+
55
+ post = nil
56
+ assert_difference ['Post.count', 'Issue.count'] do
57
+ assert_emails 0 do
58
+ post = area.posts.create_dummy
59
+ end
60
+ end
61
+
62
+ assert_difference 'Issue.count' do
63
+ assert_emails 1 do
64
+ post.send_immediatelly!
65
+ end
66
+ end
67
+
68
+ end
69
+ end