activity_notification 1.4.4 → 2.2.4

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 (271) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +22 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +17 -0
  4. data/.github/pull_request_template.md +13 -0
  5. data/.github/workflows/build.yml +116 -0
  6. data/.gitignore +15 -3
  7. data/CHANGELOG.md +200 -1
  8. data/Gemfile +17 -2
  9. data/Procfile +2 -0
  10. data/README.md +168 -1033
  11. data/Rakefile +19 -10
  12. data/activity_notification.gemspec +14 -9
  13. data/app/channels/activity_notification/notification_api_channel.rb +12 -0
  14. data/app/channels/activity_notification/notification_api_with_devise_channel.rb +46 -0
  15. data/app/channels/activity_notification/notification_channel.rb +37 -0
  16. data/app/channels/activity_notification/notification_with_devise_channel.rb +51 -0
  17. data/app/controllers/activity_notification/apidocs_controller.rb +75 -0
  18. data/app/controllers/activity_notification/notifications_api_controller.rb +143 -0
  19. data/app/controllers/activity_notification/notifications_api_with_devise_controller.rb +7 -0
  20. data/app/controllers/activity_notification/notifications_controller.rb +60 -54
  21. data/app/controllers/activity_notification/subscriptions_api_controller.rb +197 -0
  22. data/app/controllers/activity_notification/subscriptions_api_with_devise_controller.rb +7 -0
  23. data/app/controllers/activity_notification/subscriptions_controller.rb +83 -73
  24. data/app/jobs/activity_notification/notify_all_job.rb +25 -0
  25. data/app/jobs/activity_notification/notify_job.rb +26 -0
  26. data/app/jobs/activity_notification/notify_to_job.rb +25 -0
  27. data/app/views/activity_notification/notifications/default/_default.html.erb +23 -23
  28. data/app/views/activity_notification/notifications/default/_default_without_grouping.html.erb +19 -19
  29. data/app/views/activity_notification/notifications/default/_index.html.erb +3 -3
  30. data/app/views/activity_notification/notifications/default/index.html.erb +60 -7
  31. data/app/views/activity_notification/notifications/default/open.js.erb +2 -2
  32. data/app/views/activity_notification/notifications/default/open_all.js.erb +2 -2
  33. data/app/views/activity_notification/notifications/default/show.html.erb +2 -2
  34. data/app/views/activity_notification/optional_targets/default/action_cable_channel/_default.html.erb +176 -0
  35. data/app/views/activity_notification/optional_targets/default/base/_default.text.erb +1 -1
  36. data/app/views/activity_notification/optional_targets/default/slack/_default.text.erb +1 -1
  37. data/app/views/activity_notification/subscriptions/default/_form.html.erb +2 -2
  38. data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +5 -33
  39. data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +8 -8
  40. data/app/views/activity_notification/subscriptions/default/index.html.erb +13 -9
  41. data/app/views/activity_notification/subscriptions/default/show.html.erb +3 -3
  42. data/app/views/activity_notification/subscriptions/default/subscribe.js.erb +1 -1
  43. data/app/views/activity_notification/subscriptions/default/subscribe_to_email.js.erb +1 -1
  44. data/app/views/activity_notification/subscriptions/default/subscribe_to_optional_target.js.erb +1 -1
  45. data/app/views/activity_notification/subscriptions/default/unsubscribe.js.erb +1 -1
  46. data/app/views/activity_notification/subscriptions/default/unsubscribe_to_email.js.erb +1 -1
  47. data/app/views/activity_notification/subscriptions/default/unsubscribe_to_optional_target.js.erb +1 -1
  48. data/bin/_dynamodblocal +4 -0
  49. data/bin/bundle_update.sh +7 -0
  50. data/bin/deploy_on_heroku.sh +16 -0
  51. data/bin/install_dynamodblocal.sh +5 -0
  52. data/bin/start_dynamodblocal.sh +47 -0
  53. data/bin/stop_dynamodblocal.sh +34 -0
  54. data/docs/CODE_OF_CONDUCT.md +76 -0
  55. data/docs/CONTRIBUTING.md +36 -0
  56. data/docs/Functions.md +1146 -0
  57. data/docs/Setup.md +817 -0
  58. data/docs/Testing.md +148 -0
  59. data/gemfiles/Gemfile.rails-5.0 +8 -1
  60. data/gemfiles/Gemfile.rails-5.1 +7 -1
  61. data/gemfiles/Gemfile.rails-5.2 +24 -0
  62. data/gemfiles/Gemfile.rails-6.0 +23 -0
  63. data/gemfiles/Gemfile.rails-6.1 +22 -0
  64. data/gemfiles/Gemfile.rails-7.0 +25 -0
  65. data/lib/activity_notification/apis/notification_api.rb +356 -159
  66. data/lib/activity_notification/apis/subscription_api.rb +98 -59
  67. data/lib/activity_notification/apis/swagger.rb +6 -0
  68. data/lib/activity_notification/common.rb +18 -7
  69. data/lib/activity_notification/config.rb +176 -30
  70. data/lib/activity_notification/controllers/common_api_controller.rb +30 -0
  71. data/lib/activity_notification/controllers/common_controller.rb +47 -27
  72. data/lib/activity_notification/controllers/concerns/swagger/error_responses.rb +55 -0
  73. data/lib/activity_notification/controllers/concerns/swagger/notifications_api.rb +273 -0
  74. data/lib/activity_notification/controllers/concerns/swagger/notifications_parameters.rb +92 -0
  75. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_api.rb +405 -0
  76. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_parameters.rb +50 -0
  77. data/lib/activity_notification/controllers/devise_authentication_controller.rb +22 -5
  78. data/lib/activity_notification/gem_version.rb +14 -0
  79. data/lib/activity_notification/helpers/errors.rb +6 -0
  80. data/lib/activity_notification/helpers/view_helpers.rb +118 -28
  81. data/lib/activity_notification/mailers/helpers.rb +19 -12
  82. data/lib/activity_notification/models/concerns/notifiable.rb +142 -55
  83. data/lib/activity_notification/models/concerns/subscriber.rb +28 -13
  84. data/lib/activity_notification/models/concerns/swagger/error_schema.rb +36 -0
  85. data/lib/activity_notification/models/concerns/swagger/notification_schema.rb +209 -0
  86. data/lib/activity_notification/models/concerns/swagger/subscription_schema.rb +162 -0
  87. data/lib/activity_notification/models/concerns/target.rb +131 -32
  88. data/lib/activity_notification/models/notification.rb +1 -0
  89. data/lib/activity_notification/models/subscription.rb +1 -0
  90. data/lib/activity_notification/models.rb +23 -1
  91. data/lib/activity_notification/optional_targets/action_cable_api_channel.rb +69 -0
  92. data/lib/activity_notification/optional_targets/action_cable_channel.rb +68 -0
  93. data/lib/activity_notification/optional_targets/base.rb +9 -15
  94. data/lib/activity_notification/orm/active_record/notification.rb +23 -34
  95. data/lib/activity_notification/orm/active_record/subscription.rb +1 -1
  96. data/lib/activity_notification/orm/active_record.rb +1 -1
  97. data/lib/activity_notification/orm/dynamoid/extension.rb +262 -0
  98. data/lib/activity_notification/orm/dynamoid/notification.rb +224 -0
  99. data/lib/activity_notification/orm/dynamoid/subscription.rb +82 -0
  100. data/lib/activity_notification/orm/dynamoid.rb +530 -0
  101. data/lib/activity_notification/orm/mongoid/notification.rb +29 -28
  102. data/lib/activity_notification/orm/mongoid/subscription.rb +3 -3
  103. data/lib/activity_notification/orm/mongoid.rb +33 -1
  104. data/lib/activity_notification/rails/routes.rb +273 -60
  105. data/lib/activity_notification/renderable.rb +22 -7
  106. data/lib/activity_notification/roles/acts_as_notifiable.rb +64 -1
  107. data/lib/activity_notification/roles/acts_as_target.rb +99 -9
  108. data/lib/activity_notification/version.rb +1 -1
  109. data/lib/activity_notification.rb +14 -0
  110. data/lib/generators/activity_notification/controllers_generator.rb +2 -1
  111. data/lib/generators/templates/activity_notification.rb +61 -7
  112. data/lib/generators/templates/controllers/README +2 -2
  113. data/lib/generators/templates/controllers/notifications_api_controller.rb +31 -0
  114. data/lib/generators/templates/controllers/notifications_api_with_devise_controller.rb +31 -0
  115. data/lib/generators/templates/controllers/notifications_controller.rb +1 -37
  116. data/lib/generators/templates/controllers/notifications_with_devise_controller.rb +1 -45
  117. data/lib/generators/templates/controllers/subscriptions_api_controller.rb +61 -0
  118. data/lib/generators/templates/controllers/subscriptions_api_with_devise_controller.rb +61 -0
  119. data/lib/generators/templates/controllers/subscriptions_controller.rb +14 -37
  120. data/lib/generators/templates/controllers/subscriptions_with_devise_controller.rb +14 -45
  121. data/lib/generators/templates/migrations/migration.rb +5 -5
  122. data/lib/generators/templates/models/README +8 -4
  123. data/lib/generators/templates/models/notification.rb +1 -1
  124. data/lib/generators/templates/models/subscription.rb +1 -1
  125. data/lib/tasks/activity_notification_tasks.rake +14 -4
  126. data/package.json +8 -0
  127. data/spec/channels/notification_api_channel_shared_examples.rb +59 -0
  128. data/spec/channels/notification_api_channel_spec.rb +49 -0
  129. data/spec/channels/notification_api_with_devise_channel_spec.rb +76 -0
  130. data/spec/channels/notification_channel_shared_examples.rb +59 -0
  131. data/spec/channels/notification_channel_spec.rb +48 -0
  132. data/spec/channels/notification_with_devise_channel_spec.rb +97 -0
  133. data/spec/concerns/apis/notification_api_spec.rb +177 -12
  134. data/spec/concerns/apis/subscription_api_spec.rb +146 -4
  135. data/spec/concerns/common_spec.rb +25 -3
  136. data/spec/concerns/models/notifiable_spec.rb +161 -11
  137. data/spec/concerns/models/subscriber_spec.rb +253 -79
  138. data/spec/concerns/models/target_spec.rb +180 -47
  139. data/spec/concerns/renderable_spec.rb +35 -16
  140. data/spec/config_spec.rb +52 -1
  141. data/spec/controllers/controller_spec_utility.rb +100 -0
  142. data/spec/controllers/notifications_api_controller_shared_examples.rb +506 -0
  143. data/spec/controllers/notifications_api_controller_spec.rb +19 -0
  144. data/spec/controllers/notifications_api_with_devise_controller_spec.rb +60 -0
  145. data/spec/controllers/notifications_controller_shared_examples.rb +55 -76
  146. data/spec/controllers/notifications_controller_spec.rb +1 -2
  147. data/spec/controllers/notifications_with_devise_controller_spec.rb +14 -8
  148. data/spec/controllers/subscriptions_api_controller_shared_examples.rb +750 -0
  149. data/spec/controllers/subscriptions_api_controller_spec.rb +19 -0
  150. data/spec/controllers/subscriptions_api_with_devise_controller_spec.rb +60 -0
  151. data/spec/controllers/subscriptions_controller_shared_examples.rb +99 -121
  152. data/spec/controllers/subscriptions_controller_spec.rb +1 -2
  153. data/spec/controllers/subscriptions_with_devise_controller_spec.rb +14 -8
  154. data/spec/factories/notifications.rb +1 -1
  155. data/spec/factories/subscriptions.rb +3 -3
  156. data/spec/factories/users.rb +3 -3
  157. data/spec/generators/migration/migration_generator_spec.rb +29 -4
  158. data/spec/helpers/view_helpers_spec.rb +31 -21
  159. data/spec/jobs/notify_all_job_spec.rb +23 -0
  160. data/spec/jobs/notify_job_spec.rb +23 -0
  161. data/spec/jobs/notify_to_job_spec.rb +23 -0
  162. data/spec/mailers/mailer_spec.rb +42 -1
  163. data/spec/models/dummy/dummy_group_spec.rb +4 -0
  164. data/spec/models/dummy/dummy_notifiable_spec.rb +4 -0
  165. data/spec/models/dummy/dummy_notifier_spec.rb +4 -0
  166. data/spec/models/dummy/dummy_subscriber_spec.rb +3 -0
  167. data/spec/models/dummy/dummy_target_spec.rb +4 -0
  168. data/spec/models/notification_spec.rb +181 -45
  169. data/spec/models/subscription_spec.rb +77 -27
  170. data/spec/optional_targets/action_cable_api_channel_spec.rb +34 -0
  171. data/spec/optional_targets/action_cable_channel_spec.rb +41 -0
  172. data/spec/optional_targets/amazon_sns_spec.rb +0 -2
  173. data/spec/optional_targets/slack_spec.rb +0 -2
  174. data/spec/orm/dynamoid_spec.rb +115 -0
  175. data/spec/rails_app/Rakefile +9 -0
  176. data/spec/rails_app/app/assets/config/manifest.js +3 -0
  177. data/spec/rails_app/app/assets/javascripts/application.js +2 -1
  178. data/spec/rails_app/app/assets/javascripts/cable.js +12 -0
  179. data/spec/rails_app/app/controllers/admins_controller.rb +21 -0
  180. data/spec/rails_app/app/controllers/application_controller.rb +1 -1
  181. data/spec/rails_app/app/controllers/articles_controller.rb +6 -1
  182. data/spec/rails_app/app/controllers/comments_controller.rb +3 -1
  183. data/spec/rails_app/app/controllers/spa_controller.rb +7 -0
  184. data/spec/rails_app/app/controllers/users/notifications_controller.rb +0 -65
  185. data/spec/rails_app/app/controllers/users/notifications_with_devise_controller.rb +0 -73
  186. data/spec/rails_app/app/controllers/users/subscriptions_controller.rb +0 -77
  187. data/spec/rails_app/app/controllers/users/subscriptions_with_devise_controller.rb +0 -85
  188. data/spec/rails_app/app/controllers/users_controller.rb +26 -0
  189. data/spec/rails_app/app/javascript/App.vue +40 -0
  190. data/spec/rails_app/app/javascript/components/DeviseTokenAuth.vue +82 -0
  191. data/spec/rails_app/app/javascript/components/Top.vue +98 -0
  192. data/spec/rails_app/app/javascript/components/notifications/Index.vue +200 -0
  193. data/spec/rails_app/app/javascript/components/notifications/Notification.vue +133 -0
  194. data/spec/rails_app/app/javascript/components/notifications/NotificationContent.vue +122 -0
  195. data/spec/rails_app/app/javascript/components/subscriptions/Index.vue +279 -0
  196. data/spec/rails_app/app/javascript/components/subscriptions/NewSubscription.vue +112 -0
  197. data/spec/rails_app/app/javascript/components/subscriptions/NotificationKey.vue +141 -0
  198. data/spec/rails_app/app/javascript/components/subscriptions/Subscription.vue +226 -0
  199. data/spec/rails_app/app/javascript/config/development.js +5 -0
  200. data/spec/rails_app/app/javascript/config/environment.js +7 -0
  201. data/spec/rails_app/app/javascript/config/production.js +5 -0
  202. data/spec/rails_app/app/javascript/config/test.js +5 -0
  203. data/spec/rails_app/app/javascript/packs/application.js +18 -0
  204. data/spec/rails_app/app/javascript/packs/spa.js +14 -0
  205. data/spec/rails_app/app/javascript/router/index.js +73 -0
  206. data/spec/rails_app/app/javascript/store/index.js +37 -0
  207. data/spec/rails_app/app/models/admin.rb +15 -10
  208. data/spec/rails_app/app/models/article.rb +25 -20
  209. data/spec/rails_app/app/models/comment.rb +27 -62
  210. data/spec/rails_app/app/models/dummy/dummy_base.rb +1 -0
  211. data/spec/rails_app/app/models/dummy/dummy_group.rb +9 -0
  212. data/spec/rails_app/app/models/dummy/dummy_notifiable.rb +1 -0
  213. data/spec/rails_app/app/models/dummy/dummy_notifiable_target.rb +27 -0
  214. data/spec/rails_app/app/models/dummy/dummy_notifier.rb +1 -0
  215. data/spec/rails_app/app/models/dummy/dummy_subscriber.rb +1 -0
  216. data/spec/rails_app/app/models/dummy/dummy_target.rb +1 -0
  217. data/spec/rails_app/app/models/user.rb +44 -18
  218. data/spec/rails_app/app/views/activity_notification/notifications/default/article/_update.html.erb +146 -0
  219. data/spec/rails_app/app/views/activity_notification/notifications/users/overridden/custom/_test.html.erb +1 -0
  220. data/spec/rails_app/app/views/activity_notification/optional_targets/admins/amazon_sns/comment/_default.text.erb +1 -1
  221. data/spec/rails_app/app/views/articles/index.html.erb +68 -20
  222. data/spec/rails_app/app/views/articles/show.html.erb +1 -1
  223. data/spec/rails_app/app/views/layouts/_header.html.erb +9 -3
  224. data/spec/rails_app/app/views/spa/index.html.erb +2 -0
  225. data/spec/rails_app/babel.config.js +72 -0
  226. data/spec/rails_app/bin/webpack +18 -0
  227. data/spec/rails_app/bin/webpack-dev-server +18 -0
  228. data/spec/rails_app/config/application.rb +26 -6
  229. data/spec/rails_app/config/cable.yml +8 -0
  230. data/spec/rails_app/config/database.yml +1 -1
  231. data/spec/rails_app/config/dynamoid.rb +13 -0
  232. data/spec/rails_app/config/environment.rb +5 -1
  233. data/spec/rails_app/config/environments/development.rb +5 -0
  234. data/spec/rails_app/config/environments/production.rb +7 -1
  235. data/spec/rails_app/config/environments/test.rb +7 -11
  236. data/spec/rails_app/config/initializers/activity_notification.rb +63 -9
  237. data/spec/rails_app/config/initializers/copy_it.aws.rb.template +6 -0
  238. data/spec/rails_app/config/initializers/devise_token_auth.rb +55 -0
  239. data/spec/rails_app/config/initializers/mysql.rb +9 -0
  240. data/spec/rails_app/config/locales/activity_notification.en.yml +10 -4
  241. data/spec/rails_app/config/routes.rb +42 -1
  242. data/spec/rails_app/config/webpack/development.js +5 -0
  243. data/spec/rails_app/config/webpack/environment.js +7 -0
  244. data/spec/rails_app/config/webpack/loaders/vue.js +6 -0
  245. data/spec/rails_app/config/webpack/production.js +5 -0
  246. data/spec/rails_app/config/webpack/test.js +5 -0
  247. data/spec/rails_app/config/webpacker.yml +97 -0
  248. data/spec/rails_app/db/migrate/{20160715050433_create_test_tables.rb → 20160716000000_create_test_tables.rb} +1 -1
  249. data/spec/rails_app/db/migrate/{20160715050420_create_activity_notification_tables.rb → 20181209000000_create_activity_notification_tables.rb} +3 -3
  250. data/spec/rails_app/db/migrate/20191201000000_add_tokens_to_users.rb +10 -0
  251. data/spec/rails_app/db/schema.rb +46 -43
  252. data/spec/rails_app/db/seeds.rb +28 -4
  253. data/spec/rails_app/lib/custom_optional_targets/raise_error.rb +14 -0
  254. data/spec/rails_app/lib/mailer_previews/mailer_preview.rb +14 -4
  255. data/spec/rails_app/package.json +23 -0
  256. data/spec/rails_app/postcss.config.js +12 -0
  257. data/spec/roles/acts_as_group_spec.rb +0 -2
  258. data/spec/roles/acts_as_notifiable_spec.rb +80 -20
  259. data/spec/roles/acts_as_notifier_spec.rb +0 -2
  260. data/spec/roles/acts_as_target_spec.rb +1 -5
  261. data/spec/spec_helper.rb +13 -11
  262. data/spec/version_spec.rb +31 -0
  263. metadata +306 -53
  264. data/.travis.yml +0 -85
  265. data/Gemfile.lock +0 -234
  266. data/gemfiles/Gemfile.rails-4.2 +0 -17
  267. data/gemfiles/Gemfile.rails-4.2.lock +0 -225
  268. data/gemfiles/Gemfile.rails-5.0.lock +0 -234
  269. data/gemfiles/Gemfile.rails-5.1.lock +0 -234
  270. data/spec/rails_app/app/views/activity_notification/notifications/users/overriden/custom/_test.html.erb +0 -1
  271. /data/spec/rails_app/app/{models → assets/images}/.keep +0 -0
@@ -10,7 +10,7 @@ shared_examples_for :target do
10
10
  expect(test_instance.notifications.count).to eq(2)
11
11
  expect(test_instance.notifications.earliest).to eq(notification_1)
12
12
  expect(test_instance.notifications.latest).to eq(notification_2)
13
- expect(test_instance.notifications).to eq(ActivityNotification::Notification.filtered_by_target(test_instance))
13
+ expect(test_instance.notifications.to_a).to eq(ActivityNotification::Notification.filtered_by_target(test_instance).to_a)
14
14
  end
15
15
  end
16
16
 
@@ -24,10 +24,15 @@ shared_examples_for :target do
24
24
  describe ".set_target_class_defaults" do
25
25
  it "set parameter fields as default" do
26
26
  described_class.set_target_class_defaults
27
- expect(described_class._notification_email).to eq(nil)
28
- expect(described_class._notification_email_allowed).to eq(ActivityNotification.config.email_enabled)
29
- expect(described_class._notification_devise_resource).to be_a_kind_of(Proc)
30
- expect(described_class._printable_notification_target_name).to eq(:printable_name)
27
+ expect(described_class._notification_email).to eq(nil)
28
+ expect(described_class._notification_email_allowed).to eq(ActivityNotification.config.email_enabled)
29
+ expect(described_class._batch_notification_email_allowed).to eq(ActivityNotification.config.email_enabled)
30
+ expect(described_class._notification_subscription_allowed).to eq(ActivityNotification.config.subscription_enabled)
31
+ expect(described_class._notification_action_cable_allowed).to eq(ActivityNotification.config.action_cable_enabled)
32
+ expect(described_class._notification_action_cable_with_devise).to eq(ActivityNotification.config.action_cable_with_devise)
33
+ expect(described_class._notification_devise_resource).to be_a_kind_of(Proc)
34
+ expect(described_class._notification_current_devise_target).to be_a_kind_of(Proc)
35
+ expect(described_class._printable_notification_target_name).to eq(:printable_name)
31
36
  end
32
37
  end
33
38
 
@@ -264,7 +269,8 @@ shared_examples_for :target do
264
269
  expect(test_instance.notification_email_allowed?(test_notifiable, 'dummy_key')).to eq(true)
265
270
  end
266
271
 
267
- it "returns specified symbol with target and key arguments" do
272
+ it "returns specified symbol with notifiable
273
+ and key arguments" do
268
274
  module AdditionalMethods
269
275
  def custom_notification_email_allowed?(notifiable, key)
270
276
  true
@@ -391,6 +397,115 @@ shared_examples_for :target do
391
397
  end
392
398
  end
393
399
 
400
+ describe "#notification_action_cable_allowed?" do
401
+ context "without any configuration" do
402
+ it "returns ActivityNotification.config.action_cable_enabled without arguments" do
403
+ expect(test_instance.notification_action_cable_allowed?)
404
+ .to eq(ActivityNotification.config.action_cable_enabled)
405
+ end
406
+
407
+ it "returns ActivityNotification.config.action_cable_enabled with arguments" do
408
+ expect(test_instance.notification_action_cable_allowed?(test_notifiable, 'dummy_key'))
409
+ .to eq(ActivityNotification.config.action_cable_enabled)
410
+ end
411
+
412
+ it "returns false as default" do
413
+ expect(test_instance.notification_action_cable_allowed?).to be_falsey
414
+ end
415
+ end
416
+
417
+ context "configured with a field" do
418
+ it "returns specified value" do
419
+ described_class._notification_action_cable_allowed = true
420
+ expect(test_instance.notification_action_cable_allowed?).to eq(true)
421
+ end
422
+
423
+ it "returns specified symbol without argument" do
424
+ module AdditionalMethods
425
+ def custom_notification_action_cable_allowed?
426
+ true
427
+ end
428
+ end
429
+ test_instance.extend(AdditionalMethods)
430
+ described_class._notification_action_cable_allowed = :custom_notification_action_cable_allowed?
431
+ expect(test_instance.notification_action_cable_allowed?).to eq(true)
432
+ end
433
+
434
+ it "returns specified symbol with notifiable and key arguments" do
435
+ module AdditionalMethods
436
+ def custom_notification_action_cable_allowed?(notifiable, key)
437
+ true
438
+ end
439
+ end
440
+ test_instance.extend(AdditionalMethods)
441
+ described_class._notification_action_cable_allowed = :custom_notification_action_cable_allowed?
442
+ expect(test_instance.notification_action_cable_allowed?(test_notifiable, 'dummy_key')).to eq(true)
443
+ end
444
+
445
+ it "returns specified lambda with single target argument" do
446
+ described_class._notification_action_cable_allowed = ->(target){ true }
447
+ expect(test_instance.notification_action_cable_allowed?(test_notifiable, 'dummy_key')).to eq(true)
448
+ end
449
+
450
+ it "returns specified lambda with target, notifiable and key arguments" do
451
+ described_class._notification_action_cable_allowed = ->(target, notifiable, key){ true }
452
+ expect(test_instance.notification_action_cable_allowed?(test_notifiable, 'dummy_key')).to eq(true)
453
+ end
454
+ end
455
+ end
456
+
457
+ describe "#notification_action_cable_with_devise?" do
458
+ context "without any configuration" do
459
+ it "returns ActivityNotification.config.action_cable_with_devise without arguments" do
460
+ expect(test_instance.notification_action_cable_with_devise?)
461
+ .to eq(ActivityNotification.config.action_cable_with_devise)
462
+ end
463
+
464
+ it "returns false as default" do
465
+ expect(test_instance.notification_action_cable_with_devise?).to be_falsey
466
+ end
467
+ end
468
+
469
+ context "configured with a field" do
470
+ it "returns specified value" do
471
+ described_class._notification_action_cable_with_devise = true
472
+ expect(test_instance.notification_action_cable_with_devise?).to eq(true)
473
+ end
474
+
475
+ it "returns specified symbol without argument" do
476
+ module AdditionalMethods
477
+ def custom_notification_action_cable_with_devise?
478
+ true
479
+ end
480
+ end
481
+ test_instance.extend(AdditionalMethods)
482
+ described_class._notification_action_cable_with_devise = :custom_notification_action_cable_with_devise?
483
+ expect(test_instance.notification_action_cable_with_devise?).to eq(true)
484
+ end
485
+
486
+ it "returns specified lambda with single target argument" do
487
+ described_class._notification_action_cable_with_devise = ->(target){ true }
488
+ expect(test_instance.notification_action_cable_with_devise?).to eq(true)
489
+ end
490
+ end
491
+ end
492
+
493
+ describe "#notification_action_cable_channel_class_name" do
494
+ context "when custom_notification_action_cable_with_devise? returns true" do
495
+ it "returns ActivityNotification::NotificationWithDeviseChannel" do
496
+ described_class._notification_action_cable_with_devise = true
497
+ expect(test_instance.notification_action_cable_channel_class_name).to eq(ActivityNotification::NotificationWithDeviseChannel.name)
498
+ end
499
+ end
500
+
501
+ context "when custom_notification_action_cable_with_devise? returns false" do
502
+ it "returns ActivityNotification::NotificationChannel" do
503
+ described_class._notification_action_cable_with_devise = false
504
+ expect(test_instance.notification_action_cable_channel_class_name).to eq(ActivityNotification::NotificationChannel.name)
505
+ end
506
+ end
507
+ end
508
+
394
509
  describe "#authenticated_with_devise?" do
395
510
  context "without any configuration" do
396
511
  context "when the current devise resource and called target are different class instance" do
@@ -612,18 +727,39 @@ shared_examples_for :target do
612
727
  end
613
728
  end
614
729
 
615
- context 'with custom_filter options' do
730
+ context 'with later_than options' do
616
731
  it "returns filtered notifications only" do
617
- if ActivityNotification.config.orm == :active_record
618
- options = { custom_filter: ["notifications.key = ?", @key] }
619
- expect(test_instance.notification_index(options)[0]).to eq(@notification3)
620
- expect(test_instance.notification_index(options).size).to eq(1)
621
- end
732
+ options = { later_than: (@notification1.created_at.in_time_zone + 0.001).iso8601(3) }
733
+ expect(test_instance.notification_index(options)[0]).to eq(@notification3)
734
+ expect(test_instance.notification_index(options).size).to eq(1)
735
+ end
736
+ end
622
737
 
738
+ context 'with earlier_than options' do
739
+ it "returns filtered notifications only" do
740
+ options = { earlier_than: @notification1.created_at.iso8601(3) }
741
+ expect(test_instance.notification_index(options)[0]).to eq(@notification2)
742
+ expect(test_instance.notification_index(options).size).to eq(1)
743
+ end
744
+ end
745
+
746
+ context 'with custom_filter options' do
747
+ it "returns filtered notifications only" do
623
748
  options = { custom_filter: { key: @key } }
624
749
  expect(test_instance.notification_index(options)[0]).to eq(@notification3)
625
750
  expect(test_instance.notification_index(options).size).to eq(1)
626
751
  end
752
+
753
+ it "returns filtered notifications only with filter depending on ORM" do
754
+ options =
755
+ case ActivityNotification.config.orm
756
+ when :active_record then { custom_filter: ["notifications.key = ?", @key] }
757
+ when :mongoid then { custom_filter: { key: {'$eq': @key} } }
758
+ when :dynamoid then { custom_filter: {'key.begins_with': @key} }
759
+ end
760
+ expect(test_instance.notification_index(options)[0]).to eq(@notification3)
761
+ expect(test_instance.notification_index(options).size).to eq(1)
762
+ end
627
763
  end
628
764
  end
629
765
 
@@ -778,10 +914,17 @@ shared_examples_for :target do
778
914
 
779
915
  # Wrapper methods of Notification class methods
780
916
 
781
- describe "#notify_to" do
917
+ describe "#receive_notification_of" do
782
918
  it "is an alias of ActivityNotification::Notification.notify_to" do
783
919
  expect(ActivityNotification::Notification).to receive(:notify_to)
784
- test_instance.notify_to create(:user)
920
+ test_instance.receive_notification_of create(:user)
921
+ end
922
+ end
923
+
924
+ describe "#receive_notification_later_of" do
925
+ it "is an alias of ActivityNotification::Notification.notify_later_to" do
926
+ expect(ActivityNotification::Notification).to receive(:notify_later_to)
927
+ test_instance.receive_notification_later_of create(:user)
785
928
  end
786
929
  end
787
930
 
@@ -793,7 +936,7 @@ shared_examples_for :target do
793
936
  end
794
937
 
795
938
 
796
- # Methods to be overriden
939
+ # Methods to be overridden
797
940
 
798
941
  describe "#notification_index_with_attributes" do
799
942
  context "when the target has no notifications" do
@@ -880,6 +1023,22 @@ shared_examples_for :target do
880
1023
  expect(test_instance.notification_index_with_attributes(options).size).to eq(1)
881
1024
  end
882
1025
  end
1026
+
1027
+ context 'with later_than options' do
1028
+ it "returns filtered notifications only" do
1029
+ options = { later_than: (@notification1.created_at.in_time_zone + 0.001).iso8601(3) }
1030
+ expect(test_instance.notification_index_with_attributes(options)[0]).to eq(@notification3)
1031
+ expect(test_instance.notification_index_with_attributes(options).size).to eq(1)
1032
+ end
1033
+ end
1034
+
1035
+ context 'with earlier_than options' do
1036
+ it "returns filtered notifications only" do
1037
+ options = { earlier_than: @notification1.created_at.iso8601(3) }
1038
+ expect(test_instance.notification_index_with_attributes(options)[0]).to eq(@notification2)
1039
+ expect(test_instance.notification_index_with_attributes(options).size).to eq(1)
1040
+ end
1041
+ end
883
1042
  end
884
1043
 
885
1044
  context "when the target has no unopened notifications" do
@@ -924,18 +1083,8 @@ shared_examples_for :target do
924
1083
  end
925
1084
 
926
1085
  if ActivityNotification.config.orm == :active_record
927
- it "calls with_target, with_notifiable and with_notifier" do
928
- expect(ActiveRecord::Base).to receive(:includes).with(:target)
929
- expect(ActiveRecord::Base).to receive(:includes).with(:notifiable)
930
- expect(ActiveRecord::Base).to receive(:includes).with(:notifier)
931
- test_instance.unopened_notification_index_with_attributes
932
- end
933
-
934
- it "does not call with_group" do
935
- expect(ActiveRecord::Base).to receive(:includes).with(:target)
936
- expect(ActiveRecord::Base).to receive(:includes).with(:notifiable)
937
- expect(ActiveRecord::Base).not_to receive(:includes).with(:group)
938
- expect(ActiveRecord::Base).to receive(:includes).with(:notifier)
1086
+ it "calls with_target, with_notifiable, with_notifier and does not call with_group" do
1087
+ expect(ActivityNotification::Notification).to receive_message_chain(:with_target, :with_notifiable, :with_notifier)
939
1088
  test_instance.unopened_notification_index_with_attributes
940
1089
  end
941
1090
  end
@@ -950,10 +1099,7 @@ shared_examples_for :target do
950
1099
 
951
1100
  if ActivityNotification.config.orm == :active_record
952
1101
  it "calls with_group" do
953
- expect(ActiveRecord::Base).to receive(:includes).with(:target)
954
- expect(ActiveRecord::Base).to receive(:includes).with(:notifiable)
955
- expect(ActiveRecord::Base).to receive(:includes).with(:group)
956
- expect(ActiveRecord::Base).to receive(:includes).with(:notifier)
1102
+ expect(ActivityNotification::Notification).to receive_message_chain(:with_target, :with_notifiable, :with_group, :with_notifier)
957
1103
  test_instance.unopened_notification_index_with_attributes
958
1104
  end
959
1105
  end
@@ -986,18 +1132,8 @@ shared_examples_for :target do
986
1132
  end
987
1133
 
988
1134
  if ActivityNotification.config.orm == :active_record
989
- it "calls with_target, with_notifiable and with_notifier" do
990
- expect(ActiveRecord::Base).to receive(:includes).with(:target)
991
- expect(ActiveRecord::Base).to receive(:includes).with(:notifiable)
992
- expect(ActiveRecord::Base).to receive(:includes).with(:notifier)
993
- test_instance.opened_notification_index_with_attributes
994
- end
995
-
996
- it "does not call with_group" do
997
- expect(ActiveRecord::Base).to receive(:includes).with(:target)
998
- expect(ActiveRecord::Base).to receive(:includes).with(:notifiable)
999
- expect(ActiveRecord::Base).not_to receive(:includes).with(:group)
1000
- expect(ActiveRecord::Base).to receive(:includes).with(:notifier)
1135
+ it "calls with_target, with_notifiable, with_notifier and does not call with_group" do
1136
+ expect(ActivityNotification::Notification).to receive_message_chain(:with_target, :with_notifiable, :with_notifier)
1001
1137
  test_instance.opened_notification_index_with_attributes
1002
1138
  end
1003
1139
  end
@@ -1012,10 +1148,7 @@ shared_examples_for :target do
1012
1148
 
1013
1149
  if ActivityNotification.config.orm == :active_record
1014
1150
  it "calls with_group" do
1015
- expect(ActiveRecord::Base).to receive(:includes).with(:target)
1016
- expect(ActiveRecord::Base).to receive(:includes).with(:notifiable)
1017
- expect(ActiveRecord::Base).to receive(:includes).with(:group)
1018
- expect(ActiveRecord::Base).to receive(:includes).with(:notifier)
1151
+ expect(ActivityNotification::Notification).to receive_message_chain(:with_target, :with_notifiable, :with_group, :with_notifier)
1019
1152
  test_instance.opened_notification_index_with_attributes
1020
1153
  end
1021
1154
  end
@@ -4,17 +4,23 @@ shared_examples_for :renderable do
4
4
  let(:test_instance) { create(test_class_name, target: test_target) }
5
5
  let(:target_type_key) { 'user' }
6
6
 
7
- let(:notifier_name) { 'foo' }
8
- let(:article_title) { 'bar' }
9
- let(:group_member_count) { 3 }
10
- let(:simple_text_key) { 'article.create' }
11
- let(:params_text_key) { 'comment.post' }
12
- let(:group_text_key) { 'comment.reply' }
13
- let(:simple_text_original) { 'Article has been created' }
14
- let(:params_text_original) { "<p>%{notifier_name} posted comments to your article %{article_title}</p>" }
15
- let(:group_text_original) { "<p>%{notifier_name} and %{group_member_count} people replied for your comments</p>" }
16
- let(:params_text_embedded) { "<p>foo posted comments to your article bar</p>" }
17
- let(:group_text_embedded) { "<p>foo and 3 people replied for your comments</p>" }
7
+ let(:notifier_name) { 'foo' }
8
+ let(:article_title) { 'bar' }
9
+ let(:group_notification_count) { 4 }
10
+ let(:group_member_count) { 3 }
11
+ let(:simple_text_key) { 'article.create' }
12
+ let(:params_text_key) { 'article.update' }
13
+ let(:group_text_key) { 'comment.reply' }
14
+ let(:plural_text_key) { 'comment.post' }
15
+ let(:simple_text_original) { 'Article has been created' }
16
+ let(:params_text_original) { 'Article "%{article_title}" has been updated' }
17
+ let(:plural_text_original_one) { "<p>%{notifier_name} posted a comment on your article %{article_title}</p>" }
18
+ let(:plural_text_original_other) { "<p>%{notifier_name} posted %{count} comments on your article %{article_title}</p>" }
19
+ let(:group_text_original) { "<p>%{notifier_name} and %{group_member_count} other people replied %{group_notification_count} times to your comment</p>" }
20
+ let(:params_text_embedded) { 'Article "bar" has been updated' }
21
+ let(:group_text_embedded) { "<p>foo and 3 other people replied 4 times to your comment</p>" }
22
+ let(:plural_text_embedded_one) { "<p>foo posted a comment on your article bar</p>" }
23
+ let(:plural_text_embedded_other) { "<p>foo posted 4 comments on your article bar</p>" }
18
24
 
19
25
  describe "i18n configuration" do
20
26
  it "has key configured for simple text" do
@@ -26,17 +32,30 @@ shared_examples_for :renderable do
26
32
  expect(I18n.t("notification.#{target_type_key}.#{params_text_key}.text"))
27
33
  .to eq(params_text_original)
28
34
  expect(I18n.t("notification.#{target_type_key}.#{params_text_key}.text",
29
- {notifier_name: notifier_name, article_title: article_title}))
35
+ article_title: article_title))
30
36
  .to eq(params_text_embedded)
31
37
  end
32
38
 
33
- it "has key configured with embedded params including group_member_count" do
39
+ it "has key configured with embedded params including group_member_count and group_notification_count" do
34
40
  expect(I18n.t("notification.#{target_type_key}.#{group_text_key}.text"))
35
41
  .to eq(group_text_original)
36
42
  expect(I18n.t("notification.#{target_type_key}.#{group_text_key}.text",
37
- {notifier_name: notifier_name, group_member_count: group_member_count}))
43
+ **{ notifier_name: notifier_name, group_member_count: group_member_count, group_notification_count: group_notification_count }))
38
44
  .to eq(group_text_embedded)
39
45
  end
46
+
47
+ it "has key configured with plurals" do
48
+ expect(I18n.t("notification.#{target_type_key}.#{plural_text_key}.text")[:one])
49
+ .to eq(plural_text_original_one)
50
+ expect(I18n.t("notification.#{target_type_key}.#{plural_text_key}.text")[:other])
51
+ .to eq(plural_text_original_other)
52
+ expect(I18n.t("notification.#{target_type_key}.#{plural_text_key}.text",
53
+ **{ article_title: article_title, notifier_name: notifier_name, count: 1 }))
54
+ .to eq(plural_text_embedded_one)
55
+ expect(I18n.t("notification.#{target_type_key}.#{plural_text_key}.text",
56
+ **{ article_title: article_title, notifier_name: notifier_name, count: group_notification_count }))
57
+ .to eq(plural_text_embedded_other)
58
+ end
40
59
  end
41
60
 
42
61
  describe "as public instance methods" do
@@ -83,7 +102,7 @@ shared_examples_for :renderable do
83
102
  context "when the text has embedded parameters" do
84
103
  it "uses text with embedded parameters" do
85
104
  test_instance.key = params_text_key
86
- expect(test_instance.text({notifier_name: notifier_name, article_title: article_title}))
105
+ expect(test_instance.text({article_title: article_title}))
87
106
  .to eq(params_text_embedded)
88
107
  end
89
108
 
@@ -107,4 +126,4 @@ shared_examples_for :renderable do
107
126
  # #layout_path
108
127
 
109
128
  end
110
- end
129
+ end
data/spec/config_spec.rb CHANGED
@@ -7,7 +7,7 @@ describe ActivityNotification::Config do
7
7
  expect(ActivityNotification::Mailer).to receive(:send_notification_email).and_call_original
8
8
  notification.send_notification_email send_later: false
9
9
  end
10
-
10
+
11
11
  it "is not configured with CustomNotificationMailer" do
12
12
  expect(CustomNotificationMailer).not_to receive(:send_notification_email).and_call_original
13
13
  notification.send_notification_email send_later: false
@@ -31,4 +31,55 @@ describe ActivityNotification::Config do
31
31
  end
32
32
  end
33
33
  end
34
+
35
+ describe "config.store_with_associated_records" do
36
+ let(:target) { create(:confirmed_user) }
37
+
38
+ context "when it is configured as true" do
39
+ if ActivityNotification.config.orm == :active_record
40
+ it "raises ActivityNotification::ConfigError when you use active_record ORM" do
41
+ expect { ActivityNotification.config.store_with_associated_records = true }.to raise_error(ActivityNotification::ConfigError)
42
+ end
43
+ else
44
+ before do
45
+ @original = ActivityNotification.config.store_with_associated_records
46
+ ActivityNotification.config.store_with_associated_records = true
47
+ load Rails.root.join("../../lib/activity_notification/orm/#{ActivityNotification.config.orm}/notification.rb").to_s
48
+ @notification = create(:notification, target: target)
49
+ end
50
+
51
+ after do
52
+ ActivityNotification.config.store_with_associated_records = @original
53
+ load Rails.root.join("../../lib/activity_notification/orm/#{ActivityNotification.config.orm}/notification.rb").to_s
54
+ end
55
+
56
+ it "stores notification with associated records" do
57
+ expect(@notification.target).to eq(target)
58
+ expect(@notification.stored_target["id"].to_s).to eq(target.id.to_s)
59
+ end
60
+ end
61
+ end
62
+
63
+ context "when it is configured as false" do
64
+ before do
65
+ @original = ActivityNotification.config.store_with_associated_records
66
+ ActivityNotification.config.store_with_associated_records = false
67
+ load Rails.root.join("../../lib/activity_notification/orm/#{ActivityNotification.config.orm}/notification.rb").to_s
68
+ @notification = create(:notification, target: target)
69
+ end
70
+
71
+ after do
72
+ ActivityNotification.config.store_with_associated_records = @original
73
+ load Rails.root.join("../../lib/activity_notification/orm/#{ActivityNotification.config.orm}/notification.rb").to_s
74
+ end
75
+
76
+ it "does not store notification with associated records" do
77
+ expect(@notification.target).to eq(target)
78
+ begin
79
+ expect(@notification.stored_target).to be_nil
80
+ rescue NoMethodError
81
+ end
82
+ end
83
+ end
84
+ end
34
85
  end
@@ -0,0 +1,100 @@
1
+ module ActivityNotification
2
+ module ControllerSpec
3
+ module RequestUtility
4
+ def get_with_compatibility action, params, session
5
+ get action, params: params, session: session
6
+ end
7
+
8
+ def post_with_compatibility action, params, session
9
+ post action, params: params, session: session
10
+ end
11
+
12
+ def put_with_compatibility action, params, session
13
+ put action, params: params, session: session
14
+ end
15
+
16
+ def delete_with_compatibility action, params, session
17
+ delete action, params: params, session: session
18
+ end
19
+
20
+ def xhr_with_compatibility method, action, params, session
21
+ send method.to_s, action, xhr: true, params: params, session: session
22
+ end
23
+ end
24
+
25
+ module ApiResponseUtility
26
+ def response_json
27
+ JSON.parse(response.body)
28
+ end
29
+
30
+ def assert_json_with_array_size(json_array, size)
31
+ expect(json_array.size).to eq(size)
32
+ end
33
+
34
+ def assert_json_with_object(json_object, object)
35
+ expect(json_object['id'].to_s).to eq(object.id.to_s)
36
+ end
37
+
38
+ def assert_json_with_object_array(json_array, expected_object_array)
39
+ assert_json_with_array_size(json_array, expected_object_array.size)
40
+ expected_object_array.each_with_index do |json_object, index|
41
+ assert_json_with_object(json_object, expected_object_array[index])
42
+ end
43
+ end
44
+
45
+ def assert_error_response(code)
46
+ expect(response_json['gem']).to eq('activity_notification')
47
+ expect(response_json['error']['code']).to eq(code)
48
+ end
49
+ end
50
+
51
+ module CommitteeUtility
52
+ extend ActiveSupport::Concern
53
+ included do
54
+ include Committee::Rails::Test::Methods
55
+
56
+ def api_path
57
+ "/#{root_path}/#{target_type}/#{test_target.id}"
58
+ end
59
+
60
+ def schema_path
61
+ Rails.root.join('..', 'openapi.json')
62
+ end
63
+
64
+ def write_schema_file(schema_json)
65
+ File.open(schema_path, "w") { |file| file.write(schema_json) }
66
+ end
67
+
68
+ def read_schema_file
69
+ JSON.parse(File.read(schema_path))
70
+ end
71
+
72
+ def committee_options
73
+ @committee_options ||= { schema: Committee::Drivers::load_from_file(schema_path), prefix: root_path, validate_success_only: true, parse_response_by_content_type: false }
74
+ end
75
+
76
+ def get_with_compatibility path, options = {}
77
+ get path, **options
78
+ end
79
+
80
+ def post_with_compatibility path, options = {}
81
+ post path, **options
82
+ end
83
+
84
+ def put_with_compatibility path, options = {}
85
+ put path, **options
86
+ end
87
+
88
+ def delete_with_compatibility path, options = {}
89
+ delete path, **options
90
+ end
91
+
92
+ def assert_all_schema_confirm(response, status)
93
+ expect(response).to have_http_status(status)
94
+ assert_request_schema_confirm
95
+ assert_response_schema_confirm
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end