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
@@ -0,0 +1,97 @@
1
+ require 'channels/notification_channel_shared_examples'
2
+
3
+ #TODO Make it more smart test method
4
+ module ActivityNotification
5
+ module Test
6
+ class NotificationWithDeviseChannel < ::ActivityNotification::NotificationWithDeviseChannel
7
+ @@custom_current_target = nil
8
+
9
+ def set_custom_current_target(custom_current_target)
10
+ @@custom_current_target = custom_current_target
11
+ end
12
+
13
+ def find_current_target(devise_type = nil)
14
+ super(devise_type)
15
+ rescue NoMethodError
16
+ devise_type = (devise_type || @target.notification_devise_resource.class.name).to_s
17
+ @@custom_current_target.is_a?(devise_type.to_model_class) ? @@custom_current_target : nil
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ # @See https://github.com/palkan/action-cable-testing
24
+ describe ActivityNotification::Test::NotificationWithDeviseChannel, type: :channel do
25
+ let(:test_user) { create(:confirmed_user) }
26
+ let(:unauthenticated_user) { create(:confirmed_user) }
27
+ let(:test_target) { create(:admin, user: test_user) }
28
+ let(:target_type) { "Admin" }
29
+ let(:typed_target_param) { "admin_id" }
30
+ let(:extra_params) { { devise_type: :users } }
31
+ let(:valid_session) {}
32
+
33
+ #TODO Make it more smart test method
34
+ #include Devise::Test::IntegrationHelpers
35
+ def sign_in(current_target)
36
+ described_class.new(ActionCable::Channel::ConnectionStub.new, {}).set_custom_current_target(current_target)
37
+ end
38
+
39
+ before do
40
+ @user_notification_action_cable_with_devise = User._notification_action_cable_with_devise
41
+ User._notification_action_cable_with_devise = true
42
+ end
43
+
44
+ after do
45
+ User._notification_action_cable_with_devise = @user_notification_action_cable_with_devise
46
+ end
47
+
48
+ context "signed in with devise as authenticated user" do
49
+ before do
50
+ sign_in test_user
51
+ end
52
+
53
+ it_behaves_like :notification_channel
54
+ end
55
+
56
+ context "signed in with devise as unauthenticated user" do
57
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
58
+
59
+ before do
60
+ sign_in unauthenticated_user
61
+ end
62
+
63
+ it "rejects subscription" do
64
+ subscribe(target_params.merge({ typed_target_param => test_target }))
65
+ expect(subscription).to be_rejected
66
+ expect {
67
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
68
+ }.to raise_error(/Must be subscribed!/)
69
+ end
70
+ end
71
+
72
+ context "unsigned in with devise" do
73
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
74
+
75
+ it "rejects subscription" do
76
+ subscribe(target_params.merge({ typed_target_param => test_target }))
77
+ expect(subscription).to be_rejected
78
+ expect {
79
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
80
+ }.to raise_error(/Must be subscribed!/)
81
+ end
82
+ end
83
+
84
+ context "without target_id and (typed_target)_id parameters for devise integrated channel with devise_type option" do
85
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
86
+
87
+ before do
88
+ sign_in test_target.user
89
+ end
90
+
91
+ it "successfully subscribes" do
92
+ subscribe(target_params)
93
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
94
+ expect(subscription).to have_stream_from("activity_notification_channel_Admin##{test_target.id}")
95
+ end
96
+ end
97
+ end
@@ -51,8 +51,8 @@ shared_examples_for :notification_api do
51
51
  end
52
52
  }.to change { ActivityNotification::Mailer.deliveries.size }.by(2)
53
53
  expect(ActivityNotification::Mailer.deliveries.size).to eq(2)
54
- expect(ActivityNotification::Mailer.deliveries.first.to[0]).to eq(@user_1.email)
55
- expect(ActivityNotification::Mailer.deliveries.last.to[0]).to eq(@author_user.email)
54
+ expect(ActivityNotification::Mailer.deliveries.first.to[0]).to eq(@author_user.email)
55
+ expect(ActivityNotification::Mailer.deliveries.last.to[0]).to eq(@user_1.email)
56
56
  end
57
57
 
58
58
  it "sends notification email with active job queue" do
@@ -62,16 +62,41 @@ shared_examples_for :notification_api do
62
62
  end
63
63
  end
64
64
 
65
+ context "with notify_later true" do
66
+ it "generates notifications later" do
67
+ expect {
68
+ described_class.notify(:users, @comment_2, notify_later: true)
69
+ }.to have_enqueued_job(ActivityNotification::NotifyJob)
70
+ end
71
+
72
+ it "creates notification records later" do
73
+ perform_enqueued_jobs do
74
+ described_class.notify(:users, @comment_2, notify_later: true)
75
+ end
76
+ expect(@author_user.notifications.unopened_only.count).to eq(1)
77
+ expect(@user_1.notifications.unopened_only.count).to eq(1)
78
+ expect(@user_2.notifications.unopened_only.count).to eq(0)
79
+ end
80
+ end
81
+
65
82
  context "with send_later false" do
66
83
  it "sends notification email now" do
67
84
  described_class.notify(:users, @comment_2, send_later: false)
68
85
  expect(ActivityNotification::Mailer.deliveries.size).to eq(2)
69
- expect(ActivityNotification::Mailer.deliveries.first.to[0]).to eq(@user_1.email)
70
- expect(ActivityNotification::Mailer.deliveries.last.to[0]).to eq(@author_user.email)
86
+ expect(ActivityNotification::Mailer.deliveries.first.to[0]).to eq(@author_user.email)
87
+ expect(ActivityNotification::Mailer.deliveries.last.to[0]).to eq(@user_1.email)
71
88
  end
72
89
  end
73
90
 
74
91
  context "with pass_full_options" do
92
+ before do
93
+ @original_targets = Comment._notification_targets[:users]
94
+ end
95
+
96
+ after do
97
+ Comment._notification_targets[:users] = @original_targets
98
+ end
99
+
75
100
  context "as false (as default)" do
76
101
  it "accepts specified lambda with notifiable and key arguments" do
77
102
  Comment._notification_targets[:users] = ->(notifiable, key){ User.all if key == 'dummy_key' }
@@ -99,6 +124,63 @@ shared_examples_for :notification_api do
99
124
  end
100
125
  end
101
126
 
127
+ context "when some optional targets raise error" do
128
+ before do
129
+ require 'custom_optional_targets/raise_error'
130
+ @optional_target = CustomOptionalTarget::RaiseError.new
131
+ @current_optional_target = Comment._optional_targets[:users]
132
+ Comment.acts_as_notifiable :users, optional_targets: ->{ [@optional_target] }
133
+ end
134
+
135
+ after do
136
+ Comment._optional_targets[:users] = @current_optional_target
137
+ end
138
+
139
+ context "with true as ActivityNotification.config.rescue_optional_target_errors" do
140
+ it "generates notifications even if some optional targets raise error" do
141
+ rescue_optional_target_errors = ActivityNotification.config.rescue_optional_target_errors
142
+ ActivityNotification.config.rescue_optional_target_errors = true
143
+ notifications = described_class.notify(:users, @comment_2)
144
+ expect(notifications.size).to eq(2)
145
+ ActivityNotification.config.rescue_optional_target_errors = rescue_optional_target_errors
146
+ end
147
+ end
148
+
149
+ context "with false as ActivityNotification.config.rescue_optional_target_errors" do
150
+ it "raises an capturable exception" do
151
+ rescue_optional_target_errors = ActivityNotification.config.rescue_optional_target_errors
152
+ ActivityNotification.config.rescue_optional_target_errors = false
153
+ expect { described_class.notify(:users, @comment_2) }.to raise_error(RuntimeError)
154
+ ActivityNotification.config.rescue_optional_target_errors = rescue_optional_target_errors
155
+ end
156
+ end
157
+
158
+ it "allows an exception to be captured to continue" do
159
+ begin
160
+ notifications = described_class.notify(:users, @comment_2)
161
+ expect(notifications.size).to eq(2)
162
+ rescue => e
163
+ next
164
+ end
165
+ end
166
+ end
167
+ end
168
+
169
+ describe ".notify_later" do
170
+ it "generates notifications later" do
171
+ expect {
172
+ described_class.notify_later(:users, @comment_2)
173
+ }.to have_enqueued_job(ActivityNotification::NotifyJob)
174
+ end
175
+
176
+ it "creates notification records later" do
177
+ perform_enqueued_jobs do
178
+ described_class.notify_later(:users, @comment_2)
179
+ end
180
+ expect(@author_user.notifications.unopened_only.count).to eq(1)
181
+ expect(@user_1.notifications.unopened_only.count).to eq(1)
182
+ expect(@user_2.notifications.unopened_only.count).to eq(0)
183
+ end
102
184
  end
103
185
 
104
186
  describe ".notify_all" do
@@ -125,8 +207,8 @@ shared_examples_for :notification_api do
125
207
  end
126
208
  }.to change { ActivityNotification::Mailer.deliveries.size }.by(2)
127
209
  expect(ActivityNotification::Mailer.deliveries.size).to eq(2)
128
- expect(ActivityNotification::Mailer.deliveries.first.to[0]).to eq(@user_1.email)
129
- expect(ActivityNotification::Mailer.deliveries.last.to[0]).to eq(@author_user.email)
210
+ expect(ActivityNotification::Mailer.deliveries.first.to[0]).to eq(@author_user.email)
211
+ expect(ActivityNotification::Mailer.deliveries.last.to[0]).to eq(@user_1.email)
130
212
  end
131
213
 
132
214
  it "sends notification email with active job queue" do
@@ -136,13 +218,47 @@ shared_examples_for :notification_api do
136
218
  end
137
219
  end
138
220
 
221
+ context "with notify_later true" do
222
+ it "generates notifications later" do
223
+ expect {
224
+ described_class.notify_all([@author_user, @user_1], @comment_2, notify_later: true)
225
+ }.to have_enqueued_job(ActivityNotification::NotifyAllJob)
226
+ end
227
+
228
+ it "creates notification records later" do
229
+ perform_enqueued_jobs do
230
+ described_class.notify_all([@author_user, @user_1], @comment_2, notify_later: true)
231
+ end
232
+ expect(@author_user.notifications.unopened_only.count).to eq(1)
233
+ expect(@user_1.notifications.unopened_only.count).to eq(1)
234
+ expect(@user_2.notifications.unopened_only.count).to eq(0)
235
+ end
236
+ end
237
+
139
238
  context "with send_later false" do
140
239
  it "sends notification email now" do
141
240
  described_class.notify_all([@author_user, @user_1], @comment_2, send_later: false)
142
241
  expect(ActivityNotification::Mailer.deliveries.size).to eq(2)
143
- expect(ActivityNotification::Mailer.deliveries.first.to[0]).to eq(@user_1.email)
144
- expect(ActivityNotification::Mailer.deliveries.last.to[0]).to eq(@author_user.email)
242
+ expect(ActivityNotification::Mailer.deliveries.first.to[0]).to eq(@author_user.email)
243
+ expect(ActivityNotification::Mailer.deliveries.last.to[0]).to eq(@user_1.email)
244
+ end
245
+ end
246
+ end
247
+
248
+ describe ".notify_all_later" do
249
+ it "generates notifications later" do
250
+ expect {
251
+ described_class.notify_all_later([@author_user, @user_1], @comment_2)
252
+ }.to have_enqueued_job(ActivityNotification::NotifyAllJob)
253
+ end
254
+
255
+ it "creates notification records later" do
256
+ perform_enqueued_jobs do
257
+ described_class.notify_all_later([@author_user, @user_1], @comment_2)
145
258
  end
259
+ expect(@author_user.notifications.unopened_only.count).to eq(1)
260
+ expect(@user_1.notifications.unopened_only.count).to eq(1)
261
+ expect(@user_2.notifications.unopened_only.count).to eq(0)
146
262
  end
147
263
  end
148
264
 
@@ -176,6 +292,22 @@ shared_examples_for :notification_api do
176
292
  end
177
293
  end
178
294
 
295
+ context "with notify_later true" do
296
+ it "generates notifications later" do
297
+ expect {
298
+ described_class.notify_to(@user_1, @comment_2, notify_later: true)
299
+ }.to have_enqueued_job(ActivityNotification::NotifyToJob)
300
+ end
301
+
302
+ it "creates notification records later" do
303
+ perform_enqueued_jobs do
304
+ described_class.notify_to(@user_1, @comment_2, notify_later: true)
305
+ end
306
+ expect(@user_1.notifications.unopened_only.count).to eq(1)
307
+ expect(@user_2.notifications.unopened_only.count).to eq(0)
308
+ end
309
+ end
310
+
179
311
  context "with send_later false" do
180
312
  it "sends notification email now" do
181
313
  described_class.notify_to(@user_1, @comment_2, send_later: false)
@@ -217,7 +349,7 @@ shared_examples_for :notification_api do
217
349
  end
218
350
 
219
351
  it "has parameters of notifiable.notification_parameters" do
220
- expect(created_notification.parameters)
352
+ expect(created_notification.parameters.stringify_keys)
221
353
  .to eq(
222
354
  created_notification.notifiable.notification_parameters(
223
355
  @user_1.class,
@@ -355,16 +487,33 @@ shared_examples_for :notification_api do
355
487
  end
356
488
  end
357
489
 
490
+ describe ".notify_later_to" do
491
+ it "generates notifications later" do
492
+ expect {
493
+ described_class.notify_later_to(@user_1, @comment_2)
494
+ }.to have_enqueued_job(ActivityNotification::NotifyToJob)
495
+ end
496
+
497
+ it "creates notification records later" do
498
+ perform_enqueued_jobs do
499
+ described_class.notify_later_to(@user_1, @comment_2)
500
+ end
501
+ expect(@user_1.notifications.unopened_only.count).to eq(1)
502
+ expect(@user_2.notifications.unopened_only.count).to eq(0)
503
+ end
504
+ end
505
+
358
506
  describe ".open_all_of" do
359
507
  before do
360
508
  described_class.notify_to(@user_1, @article, group: @article, key: 'key.1')
509
+ sleep(0.01)
361
510
  described_class.notify_to(@user_1, @comment_2, group: @comment_2, key: 'key.2')
362
511
  expect(@user_1.notifications.unopened_only.count).to eq(2)
363
512
  expect(@user_1.notifications.opened_only!.count).to eq(0)
364
513
  end
365
514
 
366
- it "returns the number of opened notification records" do
367
- expect(described_class.open_all_of(@user_1)).to eq(2)
515
+ it "returns array of opened notification records" do
516
+ expect(described_class.open_all_of(@user_1).size).to eq(2)
368
517
  end
369
518
 
370
519
  it "opens all notifications of the target" do
@@ -427,6 +576,22 @@ shared_examples_for :notification_api do
427
576
  expect(@user_1.notifications.opened_only!.count).to eq(1)
428
577
  end
429
578
  end
579
+
580
+ context 'with later_than options' do
581
+ it "opens filtered notifications only" do
582
+ described_class.open_all_of(@user_1, { later_than: (@user_1.notifications.earliest.created_at.in_time_zone + 0.001).iso8601(3) })
583
+ expect(@user_1.notifications.unopened_only.count).to eq(1)
584
+ expect(@user_1.notifications.opened_only!.count).to eq(1)
585
+ end
586
+ end
587
+
588
+ context 'with earlier_than options' do
589
+ it "opens filtered notifications only" do
590
+ described_class.open_all_of(@user_1, { earlier_than: @user_1.notifications.latest.created_at.iso8601(3) })
591
+ expect(@user_1.notifications.unopened_only.count).to eq(1)
592
+ expect(@user_1.notifications.opened_only!.count).to eq(1)
593
+ end
594
+ end
430
595
  end
431
596
 
432
597
  describe ".group_member_exists?" do
@@ -498,7 +663,7 @@ shared_examples_for :notification_api do
498
663
  describe ".available_options" do
499
664
  it "returns list of available options in notify api" do
500
665
  expect(described_class.available_options)
501
- .to eq([:key, :group, :parameters, :notifier, :send_email, :send_later])
666
+ .to eq([:key, :group, :group_expiry_delay, :notifier, :parameters, :send_email, :send_later, :pass_full_options])
502
667
  end
503
668
  end
504
669
  end
@@ -45,6 +45,41 @@ shared_examples_for :subscription_api do
45
45
  expect(test_instance.subscribed_to_email_at).to eq(Time.current)
46
46
  Timecop.return
47
47
  end
48
+
49
+ context "with true as ActivityNotification.config.subscribe_to_email_as_default" do
50
+ it "subscribe with current time" do
51
+ ActivityNotification.config.subscribe_to_email_as_default = true
52
+
53
+ expect(test_instance.subscribing?).to eq(false)
54
+ expect(test_instance.subscribing_to_email?).to eq(false)
55
+ Timecop.freeze(Time.at(Time.now.to_i))
56
+ test_instance.subscribe
57
+ expect(test_instance.subscribing?).to eq(true)
58
+ expect(test_instance.subscribing_to_email?).to eq(true)
59
+ expect(test_instance.subscribed_at).to eq(Time.current)
60
+ expect(test_instance.subscribed_to_email_at).to eq(Time.current)
61
+ Timecop.return
62
+
63
+ ActivityNotification.config.subscribe_to_email_as_default = nil
64
+ end
65
+ end
66
+
67
+ context "with false as ActivityNotification.config.subscribe_to_email_as_default" do
68
+ it "subscribe with current time" do
69
+ ActivityNotification.config.subscribe_to_email_as_default = false
70
+
71
+ expect(test_instance.subscribing?).to eq(false)
72
+ expect(test_instance.subscribing_to_email?).to eq(false)
73
+ Timecop.freeze(Time.at(Time.now.to_i))
74
+ test_instance.subscribe
75
+ expect(test_instance.subscribing?).to eq(true)
76
+ expect(test_instance.subscribing_to_email?).to eq(false)
77
+ expect(test_instance.subscribed_at).to eq(Time.current)
78
+ Timecop.return
79
+
80
+ ActivityNotification.config.subscribe_to_email_as_default = nil
81
+ end
82
+ end
48
83
  end
49
84
 
50
85
  context "with subscribed_at option" do
@@ -58,6 +93,39 @@ shared_examples_for :subscription_api do
58
93
  expect(test_instance.subscribed_at.to_i).to eq(subscribed_at.to_i)
59
94
  expect(test_instance.subscribed_to_email_at.to_i).to eq(subscribed_at.to_i)
60
95
  end
96
+
97
+ context "with true as ActivityNotification.config.subscribe_to_email_as_default" do
98
+ it "subscribe with current time" do
99
+ ActivityNotification.config.subscribe_to_email_as_default = true
100
+
101
+ expect(test_instance.subscribing?).to eq(false)
102
+ expect(test_instance.subscribing_to_email?).to eq(false)
103
+ subscribed_at = Time.current - 1.months
104
+ test_instance.subscribe(subscribed_at: subscribed_at)
105
+ expect(test_instance.subscribing?).to eq(true)
106
+ expect(test_instance.subscribing_to_email?).to eq(true)
107
+ expect(test_instance.subscribed_at.to_i).to eq(subscribed_at.to_i)
108
+ expect(test_instance.subscribed_to_email_at.to_i).to eq(subscribed_at.to_i)
109
+
110
+ ActivityNotification.config.subscribe_to_email_as_default = nil
111
+ end
112
+ end
113
+
114
+ context "with false as ActivityNotification.config.subscribe_to_email_as_default" do
115
+ it "subscribe with current time" do
116
+ ActivityNotification.config.subscribe_to_email_as_default = false
117
+
118
+ expect(test_instance.subscribing?).to eq(false)
119
+ expect(test_instance.subscribing_to_email?).to eq(false)
120
+ subscribed_at = Time.current - 1.months
121
+ test_instance.subscribe(subscribed_at: subscribed_at)
122
+ expect(test_instance.subscribing?).to eq(true)
123
+ expect(test_instance.subscribing_to_email?).to eq(false)
124
+ expect(test_instance.subscribed_at.to_i).to eq(subscribed_at.to_i)
125
+
126
+ ActivityNotification.config.subscribe_to_email_as_default = nil
127
+ end
128
+ end
61
129
  end
62
130
 
63
131
  context "with false as with_email_subscription" do
@@ -79,6 +147,36 @@ shared_examples_for :subscription_api do
79
147
  expect(test_instance.subscribing?).to eq(true)
80
148
  expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(true)
81
149
  end
150
+
151
+ context "with true as ActivityNotification.config.subscribe_to_optional_targets_as_default" do
152
+ it "also subscribes to optional targets" do
153
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = true
154
+
155
+ test_instance.unsubscribe_to_optional_target(:console_output)
156
+ expect(test_instance.subscribing?).to eq(false)
157
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
158
+ test_instance.subscribe
159
+ expect(test_instance.subscribing?).to eq(true)
160
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(true)
161
+
162
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = nil
163
+ end
164
+ end
165
+
166
+ context "with false as ActivityNotification.config.subscribe_to_optional_targets_as_default" do
167
+ it "does not subscribe to optional targets" do
168
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = false
169
+
170
+ test_instance.unsubscribe_to_optional_target(:console_output)
171
+ expect(test_instance.subscribing?).to eq(false)
172
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
173
+ test_instance.subscribe
174
+ expect(test_instance.subscribing?).to eq(true)
175
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
176
+
177
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = nil
178
+ end
179
+ end
82
180
  end
83
181
 
84
182
  context "with false as with_optional_targets" do
@@ -210,7 +308,7 @@ shared_examples_for :subscription_api do
210
308
  test_instance.update(optional_targets: {})
211
309
  end
212
310
 
213
- context "without configured optional target subscpriotion" do
311
+ context "without configured optional target subscription" do
214
312
  context "without subscribe_as_default argument" do
215
313
  context "with true as ActivityNotification.config.subscribe_as_default" do
216
314
  it "returns true" do
@@ -219,6 +317,28 @@ shared_examples_for :subscription_api do
219
317
  expect(test_instance.subscribing_to_optional_target?(:console_output)).to be_truthy
220
318
  ActivityNotification.config.subscribe_as_default = subscribe_as_default
221
319
  end
320
+
321
+ context "with true as ActivityNotification.config.subscribe_to_optional_targets_as_default" do
322
+ it "returns true" do
323
+ subscribe_as_default = ActivityNotification.config.subscribe_as_default
324
+ ActivityNotification.config.subscribe_as_default = true
325
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = true
326
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to be_truthy
327
+ ActivityNotification.config.subscribe_as_default = subscribe_as_default
328
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = nil
329
+ end
330
+ end
331
+
332
+ context "with false as ActivityNotification.config.subscribe_to_optional_targets_as_default" do
333
+ it "returns false" do
334
+ subscribe_as_default = ActivityNotification.config.subscribe_as_default
335
+ ActivityNotification.config.subscribe_as_default = true
336
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = false
337
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to be_falsey
338
+ ActivityNotification.config.subscribe_as_default = subscribe_as_default
339
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = nil
340
+ end
341
+ end
222
342
  end
223
343
 
224
344
  context "with false as ActivityNotification.config.subscribe_as_default" do
@@ -228,11 +348,33 @@ shared_examples_for :subscription_api do
228
348
  expect(test_instance.subscribing_to_optional_target?(:console_output)).to be_falsey
229
349
  ActivityNotification.config.subscribe_as_default = subscribe_as_default
230
350
  end
351
+
352
+ context "with true as ActivityNotification.config.subscribe_to_optional_targets_as_default" do
353
+ it "returns false" do
354
+ subscribe_as_default = ActivityNotification.config.subscribe_as_default
355
+ ActivityNotification.config.subscribe_as_default = false
356
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = true
357
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to be_falsey
358
+ ActivityNotification.config.subscribe_as_default = subscribe_as_default
359
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = nil
360
+ end
361
+ end
362
+
363
+ context "with false as ActivityNotification.config.subscribe_to_optional_targets_as_default" do
364
+ it "returns false" do
365
+ subscribe_as_default = ActivityNotification.config.subscribe_as_default
366
+ ActivityNotification.config.subscribe_as_default = false
367
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = false
368
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to be_falsey
369
+ ActivityNotification.config.subscribe_as_default = subscribe_as_default
370
+ ActivityNotification.config.subscribe_to_optional_targets_as_default = nil
371
+ end
372
+ end
231
373
  end
232
374
  end
233
375
  end
234
376
 
235
- context "with configured subscpriotion" do
377
+ context "with configured subscription" do
236
378
  context "subscribing to optional target" do
237
379
  it "returns true" do
238
380
  test_instance.subscribe_to_optional_target(:console_output)
@@ -279,7 +421,7 @@ shared_examples_for :subscription_api do
279
421
  test_instance.subscribe_to_optional_target(:console_output)
280
422
  expect(test_instance.subscribing?).to eq(true)
281
423
  expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(true)
282
- expect(test_instance.optional_targets[:subscribed_to_console_output_at]).to eq(Time.current)
424
+ expect(test_instance.optional_targets[:subscribed_to_console_output_at]).to eq(ActivityNotification::Subscription.convert_time_as_hash(Time.current))
283
425
  Timecop.return
284
426
  end
285
427
  end
@@ -310,7 +452,7 @@ shared_examples_for :subscription_api do
310
452
  test_instance.unsubscribe_to_optional_target(:console_output)
311
453
  expect(test_instance.subscribing?).to eq(true)
312
454
  expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
313
- expect(test_instance.optional_targets[:unsubscribed_to_console_output_at]).to eq(Time.current)
455
+ expect(test_instance.optional_targets[:unsubscribed_to_console_output_at]).to eq(ActivityNotification::Subscription.convert_time_as_hash(Time.current))
314
456
  Timecop.return
315
457
  end
316
458
  end
@@ -34,7 +34,7 @@ shared_examples_for :common do
34
34
  test_instance.extend(AdditionalMethods)
35
35
  expect(ActivityNotification.resolve_value(test_instance, :custom_method)).to eq(1)
36
36
  end
37
-
37
+
38
38
  it "returns specified symbol with controller and additional arguments" do
39
39
  module AdditionalMethods
40
40
  def custom_method(controller, key)
@@ -45,6 +45,17 @@ shared_examples_for :common do
45
45
  expect(ActivityNotification.resolve_value(test_instance, :custom_method, 'test1.key')).to eq(1)
46
46
  expect(ActivityNotification.resolve_value(test_instance, :custom_method, 'test2.key')).to eq(0)
47
47
  end
48
+
49
+ it "returns specified symbol with controller and additional arguments including hash as last argument" do
50
+ module AdditionalMethods
51
+ def custom_method(controller, key, options:)
52
+ controller == 'StubController' and key == 'test1.key' ? 1 : 0
53
+ end
54
+ end
55
+ test_instance.extend(AdditionalMethods)
56
+ expect(ActivityNotification.resolve_value(test_instance, :custom_method, 'test1.key', options: 1)).to eq(1)
57
+ expect(ActivityNotification.resolve_value(test_instance, :custom_method, 'test2.key', options: 1)).to eq(0)
58
+ end
48
59
  end
49
60
 
50
61
  context "with Proc" do
@@ -62,7 +73,7 @@ shared_examples_for :common do
62
73
  test_proc = ->(controller, model){ controller == 'StubController' and model == test_instance ? 1 : 0 }
63
74
  expect(ActivityNotification.resolve_value(test_instance, test_proc)).to eq(1)
64
75
  end
65
-
76
+
66
77
  it "returns specified lambda with controller, context(model) and additional arguments" do
67
78
  test_proc = ->(controller, model, key){ controller == 'StubController' and model == test_instance and key == 'test1.key' ? 1 : 0 }
68
79
  expect(ActivityNotification.resolve_value(test_instance, test_proc, 'test1.key')).to eq(1)
@@ -118,6 +129,17 @@ shared_examples_for :common do
118
129
  expect(test_instance.resolve_value(:custom_method, 'test1.key')).to eq(1)
119
130
  expect(test_instance.resolve_value(:custom_method, 'test2.key')).to eq(0)
120
131
  end
132
+
133
+ it "returns specified symbol with additional arguments including hash as last argument" do
134
+ module AdditionalMethods
135
+ def custom_method(key, options:)
136
+ key == 'test1.key' ? 1 : 0
137
+ end
138
+ end
139
+ test_instance.extend(AdditionalMethods)
140
+ expect(test_instance.resolve_value(:custom_method, 'test1.key', options: 1)).to eq(1)
141
+ expect(test_instance.resolve_value(:custom_method, 'test2.key', options: 1)).to eq(0)
142
+ end
121
143
  end
122
144
 
123
145
  context "with Proc" do
@@ -188,4 +210,4 @@ shared_examples_for :common do
188
210
  end
189
211
  end
190
212
 
191
- end
213
+ end