activity_notification 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. checksums.yaml +4 -4
  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/.gitignore +10 -3
  6. data/.travis.yml +6 -5
  7. data/CHANGELOG.md +22 -0
  8. data/Gemfile +8 -2
  9. data/Procfile +1 -1
  10. data/README.md +153 -1510
  11. data/activity_notification.gemspec +4 -1
  12. data/app/channels/activity_notification/notification_api_channel.rb +12 -0
  13. data/app/channels/activity_notification/notification_api_with_devise_channel.rb +46 -0
  14. data/app/channels/activity_notification/notification_channel.rb +1 -1
  15. data/app/channels/activity_notification/notification_with_devise_channel.rb +1 -1
  16. data/app/controllers/activity_notification/apidocs_controller.rb +75 -0
  17. data/app/controllers/activity_notification/notifications_api_controller.rb +143 -0
  18. data/app/controllers/activity_notification/notifications_api_with_devise_controller.rb +7 -0
  19. data/app/controllers/activity_notification/notifications_controller.rb +79 -53
  20. data/app/controllers/activity_notification/subscriptions_api_controller.rb +197 -0
  21. data/app/controllers/activity_notification/subscriptions_api_with_devise_controller.rb +7 -0
  22. data/app/controllers/activity_notification/subscriptions_controller.rb +78 -69
  23. data/app/views/activity_notification/notifications/default/_default.html.erb +18 -18
  24. data/app/views/activity_notification/notifications/default/_default_without_grouping.html.erb +14 -14
  25. data/app/views/activity_notification/notifications/default/index.html.erb +6 -6
  26. data/app/views/activity_notification/optional_targets/default/action_cable_channel/_default.html.erb +176 -0
  27. data/app/views/activity_notification/subscriptions/default/_form.html.erb +1 -1
  28. data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +3 -31
  29. data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +7 -7
  30. data/app/views/activity_notification/subscriptions/default/index.html.erb +11 -7
  31. data/bin/deploy_on_heroku.sh +3 -1
  32. data/docs/CODE_OF_CONDUCT.md +76 -0
  33. data/docs/CONTRIBUTING.md +36 -0
  34. data/docs/Functions.md +1130 -0
  35. data/docs/Setup.md +674 -0
  36. data/docs/Testing.md +148 -0
  37. data/gemfiles/Gemfile.rails-4.2 +3 -0
  38. data/gemfiles/Gemfile.rails-5.0 +3 -0
  39. data/gemfiles/Gemfile.rails-5.1 +3 -0
  40. data/gemfiles/Gemfile.rails-5.2 +3 -0
  41. data/gemfiles/{Gemfile.rails-6.0.rc → Gemfile.rails-6.0} +5 -3
  42. data/lib/activity_notification.rb +13 -1
  43. data/lib/activity_notification/apis/notification_api.rb +29 -92
  44. data/lib/activity_notification/apis/subscription_api.rb +20 -8
  45. data/lib/activity_notification/apis/swagger.rb +6 -0
  46. data/lib/activity_notification/config.rb +41 -21
  47. data/lib/activity_notification/controllers/common_api_controller.rb +30 -0
  48. data/lib/activity_notification/controllers/common_controller.rb +44 -20
  49. data/lib/activity_notification/controllers/concerns/swagger/error_responses.rb +55 -0
  50. data/lib/activity_notification/controllers/concerns/swagger/notifications_api.rb +273 -0
  51. data/lib/activity_notification/controllers/concerns/swagger/notifications_parameters.rb +92 -0
  52. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_api.rb +405 -0
  53. data/lib/activity_notification/controllers/concerns/swagger/subscriptions_parameters.rb +50 -0
  54. data/lib/activity_notification/controllers/devise_authentication_controller.rb +7 -6
  55. data/lib/activity_notification/gem_version.rb +14 -0
  56. data/lib/activity_notification/helpers/errors.rb +2 -0
  57. data/lib/activity_notification/helpers/view_helpers.rb +4 -0
  58. data/lib/activity_notification/mailers/helpers.rb +17 -10
  59. data/lib/activity_notification/models/concerns/notifiable.rb +26 -10
  60. data/lib/activity_notification/models/concerns/subscriber.rb +12 -1
  61. data/lib/activity_notification/models/concerns/swagger/error_schema.rb +36 -0
  62. data/lib/activity_notification/models/concerns/swagger/notification_schema.rb +209 -0
  63. data/lib/activity_notification/models/concerns/swagger/subscription_schema.rb +162 -0
  64. data/lib/activity_notification/models/concerns/target.rb +36 -10
  65. data/lib/activity_notification/models/notification.rb +1 -0
  66. data/lib/activity_notification/models/subscription.rb +1 -0
  67. data/lib/activity_notification/optional_targets/action_cable_api_channel.rb +69 -0
  68. data/lib/activity_notification/optional_targets/action_cable_channel.rb +68 -0
  69. data/lib/activity_notification/optional_targets/base.rb +7 -13
  70. data/lib/activity_notification/orm/active_record/notification.rb +17 -1
  71. data/lib/activity_notification/orm/active_record/subscription.rb +1 -1
  72. data/lib/activity_notification/orm/dynamoid.rb +28 -0
  73. data/lib/activity_notification/orm/dynamoid/extension.rb +79 -1
  74. data/lib/activity_notification/orm/dynamoid/notification.rb +1 -1
  75. data/lib/activity_notification/orm/dynamoid/subscription.rb +1 -1
  76. data/lib/activity_notification/orm/mongoid.rb +22 -0
  77. data/lib/activity_notification/orm/mongoid/notification.rb +17 -1
  78. data/lib/activity_notification/orm/mongoid/subscription.rb +1 -1
  79. data/lib/activity_notification/rails/routes.rb +132 -48
  80. data/lib/activity_notification/renderable.rb +13 -2
  81. data/lib/activity_notification/roles/acts_as_notifiable.rb +38 -20
  82. data/lib/activity_notification/version.rb +1 -1
  83. data/lib/generators/activity_notification/controllers_generator.rb +2 -1
  84. data/lib/generators/templates/activity_notification.rb +8 -0
  85. data/lib/generators/templates/controllers/notifications_api_controller.rb +31 -0
  86. data/lib/generators/templates/controllers/notifications_api_with_devise_controller.rb +31 -0
  87. data/lib/generators/templates/controllers/notifications_controller.rb +1 -37
  88. data/lib/generators/templates/controllers/notifications_with_devise_controller.rb +1 -45
  89. data/lib/generators/templates/controllers/subscriptions_api_controller.rb +61 -0
  90. data/lib/generators/templates/controllers/subscriptions_api_with_devise_controller.rb +61 -0
  91. data/lib/generators/templates/controllers/subscriptions_controller.rb +14 -37
  92. data/lib/generators/templates/controllers/subscriptions_with_devise_controller.rb +14 -45
  93. data/lib/generators/templates/models/README +8 -4
  94. data/lib/generators/templates/models/notification.rb +1 -1
  95. data/lib/generators/templates/models/subscription.rb +1 -1
  96. data/package.json +8 -0
  97. data/spec/channels/notification_api_channel_shared_examples.rb +59 -0
  98. data/spec/channels/notification_api_channel_spec.rb +51 -0
  99. data/spec/channels/notification_api_with_devise_channel_spec.rb +78 -0
  100. data/spec/concerns/apis/notification_api_spec.rb +37 -2
  101. data/spec/concerns/models/notifiable_spec.rb +64 -0
  102. data/spec/concerns/models/subscriber_spec.rb +13 -16
  103. data/spec/concerns/models/target_spec.rb +32 -0
  104. data/spec/concerns/renderable_spec.rb +2 -2
  105. data/spec/controllers/controller_spec_utility.rb +136 -0
  106. data/spec/controllers/notifications_api_controller_shared_examples.rb +506 -0
  107. data/spec/controllers/notifications_api_controller_spec.rb +19 -0
  108. data/spec/controllers/notifications_api_with_devise_controller_spec.rb +60 -0
  109. data/spec/controllers/notifications_controller_shared_examples.rb +54 -79
  110. data/spec/controllers/notifications_controller_spec.rb +1 -2
  111. data/spec/controllers/notifications_with_devise_controller_spec.rb +3 -12
  112. data/spec/controllers/subscriptions_api_controller_shared_examples.rb +750 -0
  113. data/spec/controllers/subscriptions_api_controller_spec.rb +19 -0
  114. data/spec/controllers/subscriptions_api_with_devise_controller_spec.rb +60 -0
  115. data/spec/controllers/subscriptions_controller_shared_examples.rb +94 -121
  116. data/spec/controllers/subscriptions_controller_spec.rb +1 -2
  117. data/spec/controllers/subscriptions_with_devise_controller_spec.rb +3 -12
  118. data/spec/helpers/view_helpers_spec.rb +4 -11
  119. data/spec/mailers/mailer_spec.rb +41 -0
  120. data/spec/models/notification_spec.rb +17 -0
  121. data/spec/models/subscription_spec.rb +0 -13
  122. data/spec/optional_targets/action_cable_api_channel_spec.rb +37 -0
  123. data/spec/optional_targets/action_cable_channel_spec.rb +44 -0
  124. data/spec/optional_targets/amazon_sns_spec.rb +0 -2
  125. data/spec/optional_targets/slack_spec.rb +0 -2
  126. data/spec/rails_app/Rakefile +9 -0
  127. data/spec/rails_app/app/assets/config/manifest.js +3 -0
  128. data/spec/rails_app/app/assets/images/.keep +0 -0
  129. data/spec/rails_app/app/controllers/admins_controller.rb +21 -0
  130. data/spec/rails_app/app/controllers/application_controller.rb +1 -1
  131. data/spec/rails_app/app/controllers/articles_controller.rb +6 -3
  132. data/spec/rails_app/app/controllers/spa_controller.rb +7 -0
  133. data/spec/rails_app/app/controllers/users/notifications_controller.rb +0 -65
  134. data/spec/rails_app/app/controllers/users/notifications_with_devise_controller.rb +0 -73
  135. data/spec/rails_app/app/controllers/users/subscriptions_controller.rb +0 -77
  136. data/spec/rails_app/app/controllers/users/subscriptions_with_devise_controller.rb +0 -85
  137. data/spec/rails_app/app/controllers/users_controller.rb +21 -0
  138. data/spec/rails_app/app/javascript/App.vue +104 -0
  139. data/spec/rails_app/app/javascript/components/DeviseTokenAuth.vue +83 -0
  140. data/spec/rails_app/app/javascript/components/Top.vue +99 -0
  141. data/spec/rails_app/app/javascript/components/notifications/Index.vue +200 -0
  142. data/spec/rails_app/app/javascript/components/notifications/Notification.vue +133 -0
  143. data/spec/rails_app/app/javascript/components/notifications/NotificationContent.vue +122 -0
  144. data/spec/rails_app/app/javascript/components/subscriptions/Index.vue +279 -0
  145. data/spec/rails_app/app/javascript/components/subscriptions/NewSubscription.vue +112 -0
  146. data/spec/rails_app/app/javascript/components/subscriptions/NotificationKey.vue +141 -0
  147. data/spec/rails_app/app/javascript/components/subscriptions/Subscription.vue +226 -0
  148. data/spec/rails_app/app/javascript/config/development.js +5 -0
  149. data/spec/rails_app/app/javascript/config/environment.js +7 -0
  150. data/spec/rails_app/app/javascript/config/production.js +5 -0
  151. data/spec/rails_app/app/javascript/config/test.js +5 -0
  152. data/spec/rails_app/app/javascript/packs/application.js +18 -0
  153. data/spec/rails_app/app/javascript/packs/spa.js +11 -0
  154. data/spec/rails_app/app/javascript/store/auth.js +37 -0
  155. data/spec/rails_app/app/models/admin.rb +16 -15
  156. data/spec/rails_app/app/models/article.rb +26 -21
  157. data/spec/rails_app/app/models/comment.rb +24 -71
  158. data/spec/rails_app/app/models/user.rb +43 -20
  159. data/spec/rails_app/app/views/activity_notification/notifications/default/article/_update.html.erb +146 -0
  160. data/spec/rails_app/app/views/articles/index.html.erb +51 -7
  161. data/spec/rails_app/app/views/articles/show.html.erb +1 -1
  162. data/spec/rails_app/app/views/layouts/_header.html.erb +8 -10
  163. data/spec/rails_app/app/views/spa/index.html.erb +2 -0
  164. data/spec/rails_app/babel.config.js +72 -0
  165. data/spec/rails_app/bin/webpack +18 -0
  166. data/spec/rails_app/bin/webpack-dev-server +18 -0
  167. data/spec/rails_app/config/application.rb +15 -2
  168. data/spec/rails_app/config/environment.rb +2 -1
  169. data/spec/rails_app/config/environments/development.rb +5 -0
  170. data/spec/rails_app/config/environments/production.rb +3 -0
  171. data/spec/rails_app/config/environments/test.rb +5 -0
  172. data/spec/rails_app/config/initializers/activity_notification.rb +8 -0
  173. data/spec/rails_app/config/initializers/devise_token_auth.rb +55 -0
  174. data/spec/rails_app/config/initializers/mysql.rb +9 -0
  175. data/spec/rails_app/config/locales/activity_notification.en.yml +2 -2
  176. data/spec/rails_app/config/routes.rb +33 -1
  177. data/spec/rails_app/config/webpack/development.js +5 -0
  178. data/spec/rails_app/config/webpack/environment.js +7 -0
  179. data/spec/rails_app/config/webpack/loaders/vue.js +6 -0
  180. data/spec/rails_app/config/webpack/production.js +5 -0
  181. data/spec/rails_app/config/webpack/test.js +5 -0
  182. data/spec/rails_app/config/webpacker.yml +97 -0
  183. data/spec/rails_app/db/migrate/20191201000000_add_tokens_to_users.rb +10 -0
  184. data/spec/rails_app/db/schema.rb +4 -1
  185. data/spec/rails_app/db/seeds.rb +1 -0
  186. data/spec/rails_app/lib/custom_optional_targets/raise_error.rb +14 -0
  187. data/spec/rails_app/package.json +23 -0
  188. data/spec/rails_app/postcss.config.js +12 -0
  189. data/spec/roles/acts_as_group_spec.rb +0 -2
  190. data/spec/roles/acts_as_notifiable_spec.rb +1 -3
  191. data/spec/roles/acts_as_notifier_spec.rb +0 -2
  192. data/spec/roles/acts_as_target_spec.rb +0 -4
  193. data/spec/spec_helper.rb +7 -15
  194. data/spec/version_spec.rb +31 -0
  195. metadata +187 -13
@@ -4,11 +4,16 @@ class <%= @target_prefix %>SubscriptionsController < ActivityNotification::Subsc
4
4
  # super
5
5
  # end
6
6
 
7
- # POST /:target_type/:target_id/subscriptions
7
+ # PUT /:target_type/:target_id/subscriptions
8
8
  # def create
9
9
  # super
10
10
  # end
11
11
 
12
+ # GET /:target_type/:target_id/subscriptions/find
13
+ def find
14
+ super
15
+ end
16
+
12
17
  # GET /:target_type/:target_id/subscriptions/:id
13
18
  # def show
14
19
  # super
@@ -19,61 +24,33 @@ class <%= @target_prefix %>SubscriptionsController < ActivityNotification::Subsc
19
24
  # super
20
25
  # end
21
26
 
22
- # POST /:target_type/:target_id/subscriptions/:id/subscribe
27
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe
23
28
  # def subscribe
24
29
  # super
25
30
  # end
26
31
 
27
- # POST /:target_type/:target_id/subscriptions/:id/unsubscribe
32
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe
28
33
  # def unsubscribe
29
34
  # super
30
35
  # end
31
36
 
32
- # POST /:target_type/:target_id/subscriptions/:id/subscribe_to_email
37
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_email
33
38
  # def subscribe_to_email
34
39
  # super
35
40
  # end
36
41
 
37
- # POST /:target_type/:target_id/subscriptions/:id/unsubscribe_to_email
42
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_email
38
43
  # def unsubscribe_to_email
39
44
  # super
40
45
  # end
41
46
 
42
- # protected
43
-
44
- # def set_target
45
- # super
46
- # end
47
-
48
- # def set_subscription
49
- # super
50
- # end
51
-
52
- # def subscription_params
53
- # super
54
- # end
55
-
56
- # def set_index_options
57
- # super
58
- # end
59
-
60
- # def load_index
61
- # super
62
- # end
63
-
64
- # def controller_path
65
- # super
66
- # end
67
-
68
- # def target_view_path
69
- # super
70
- # end
71
-
72
- # def set_view_prefixes
47
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_optional_target
48
+ # def subscribe_to_optional_target
73
49
  # super
74
50
  # end
75
51
 
76
- # def return_back_or_ajax
52
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_optional_target
53
+ # def unsubscribe_to_optional_target
77
54
  # super
78
55
  # end
79
56
  end
@@ -4,11 +4,16 @@ class <%= @target_prefix %>SubscriptionsWithDeviseController < ActivityNotificat
4
4
  # super
5
5
  # end
6
6
 
7
- # POST /:target_type/:target_id/subscriptions
7
+ # PUT /:target_type/:target_id/subscriptions
8
8
  # def create
9
9
  # super
10
10
  # end
11
11
 
12
+ # GET /:target_type/:target_id/subscriptions/find
13
+ def find
14
+ super
15
+ end
16
+
12
17
  # GET /:target_type/:target_id/subscriptions/:id
13
18
  # def show
14
19
  # super
@@ -19,69 +24,33 @@ class <%= @target_prefix %>SubscriptionsWithDeviseController < ActivityNotificat
19
24
  # super
20
25
  # end
21
26
 
22
- # POST /:target_type/:target_id/subscriptions/:id/subscribe
27
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe
23
28
  # def subscribe
24
29
  # super
25
30
  # end
26
31
 
27
- # POST /:target_type/:target_id/subscriptions/:id/unsubscribe
32
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe
28
33
  # def unsubscribe
29
34
  # super
30
35
  # end
31
36
 
32
- # POST /:target_type/:target_id/subscriptions/:id/subscribe_to_email
37
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_email
33
38
  # def subscribe_to_email
34
39
  # super
35
40
  # end
36
41
 
37
- # POST /:target_type/:target_id/subscriptions/:id/unsubscribe_to_email
42
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_email
38
43
  # def unsubscribe_to_email
39
44
  # super
40
45
  # end
41
46
 
42
- # protected
43
-
44
- # def set_target
45
- # super
46
- # end
47
-
48
- # def set_subscription
49
- # super
50
- # end
51
-
52
- # def subscription_params
53
- # super
54
- # end
55
-
56
- # def set_index_options
57
- # super
58
- # end
59
-
60
- # def load_index
61
- # super
62
- # end
63
-
64
- # def controller_path
65
- # super
66
- # end
67
-
68
- # def target_view_path
69
- # super
70
- # end
71
-
72
- # def set_view_prefixes
73
- # super
74
- # end
75
-
76
- # def return_back_or_ajax
77
- # super
78
- # end
79
-
80
- # def authenticate_devise_resource!
47
+ # PUT /:target_type/:target_id/subscriptions/:id/subscribe_to_optional_target
48
+ # def subscribe_to_optional_target
81
49
  # super
82
50
  # end
83
51
 
84
- # def authenticate_target!
52
+ # PUT /:target_type/:target_id/subscriptions/:id/unsubscribe_to_optional_target
53
+ # def unsubscribe_to_optional_target
85
54
  # super
86
55
  # end
87
56
  end
@@ -1,10 +1,14 @@
1
1
  ===============================================================================
2
2
 
3
- Some setup you must do manually if you haven't yet:
3
+ activity_notification uses internal models for notifications and subscriptions
4
+ - ActivityNotification::Notification
5
+ - ActivityNotification::Subscription
4
6
 
5
- Ensure you have configured model name in your initializer activity_notification.rb.
6
- For example:
7
+ You can use your own models with same database table used by these internal models.
7
8
 
8
- #TODO
9
+ Ensure you have configured table name in your initializer activity_notification.rb.
10
+ For example:
11
+ config.notification_table_name = "notifications"
12
+ config.subscription_table_name = "subscriptions"
9
13
 
10
14
  ===============================================================================
@@ -1,4 +1,4 @@
1
- # Notification model for customisation & custom methods
1
+ # Notification model for customization & custom methods
2
2
  class <%= @target_prefix %><%= @model_name %> < ActivityNotification::Notification
3
3
  # Write custom methods or override methods here
4
4
  end
@@ -1,4 +1,4 @@
1
- # Subscription model for customisation & custom methods
1
+ # Subscription model for customization & custom methods
2
2
  class <%= @target_prefix %><%= @model_name %> < ActivityNotification::Subscription
3
3
  # Write custom methods or override methods here
4
4
  end
@@ -0,0 +1,8 @@
1
+ {
2
+ "engines": {
3
+ "yarn": "1.x"
4
+ },
5
+ "scripts": {
6
+ "postinstall": "cd ./spec/rails_app && yarn && yarn install --check-files"
7
+ }
8
+ }
@@ -0,0 +1,59 @@
1
+ # @See https://github.com/palkan/action-cable-testing
2
+ shared_examples_for :notification_api_channel do
3
+ let(:target_params) { { target_type: target_type }.merge(extra_params || {}) }
4
+
5
+ before { stub_connection }
6
+
7
+ context "with target_type and target_id parameters" do
8
+ it "successfully subscribes" do
9
+ subscribe(target_params.merge({ target_id: test_target.id, typed_target_param => 'dummy' }).merge(@auth_headers))
10
+ expect(subscription).to be_confirmed
11
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
12
+ end
13
+ end
14
+
15
+ context "with target_type and (typed_target)_id parameters" do
16
+ it "successfully subscribes" do
17
+ subscribe(target_params.merge({ typed_target_param => test_target.id }).merge(@auth_headers))
18
+ expect(subscription).to be_confirmed
19
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
20
+ end
21
+ end
22
+
23
+ context "without any parameters" do
24
+ it "rejects subscription" do
25
+ subscribe(@auth_headers)
26
+ expect(subscription).to be_rejected
27
+ expect {
28
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
29
+ }.to raise_error(/Must be subscribed!/)
30
+ end
31
+ end
32
+
33
+ context "without target_type parameter" do
34
+ it "rejects subscription" do
35
+ subscribe({ typed_target_param => test_target.id }.merge(@auth_headers))
36
+ expect(subscription).to be_rejected
37
+ expect {
38
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
39
+ }.to raise_error(/Must be subscribed!/)
40
+ end
41
+ end
42
+
43
+ context "without target_id and (typed_target)_id parameters" do
44
+ it "rejects subscription" do
45
+ subscribe(target_params.merge(@auth_headers))
46
+ expect(subscription).to be_rejected
47
+ end
48
+ end
49
+
50
+ context "with not found (typed_target)_id parameter" do
51
+ it "rejects subscription" do
52
+ subscribe(target_params.merge({ typed_target_param => 0 }).merge(@auth_headers))
53
+ expect(subscription).to be_rejected
54
+ expect {
55
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
56
+ }.to raise_error(/Must be subscribed!/)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,51 @@
1
+ if Rails::VERSION::MAJOR >= 5
2
+ require 'channels/notification_api_channel_shared_examples'
3
+
4
+ # @See https://github.com/palkan/action-cable-testing
5
+ describe ActivityNotification::NotificationApiChannel, type: :channel do
6
+ let(:test_target) { create(:user) }
7
+ let(:target_type) { "User" }
8
+ let(:typed_target_param) { "user_id" }
9
+ let(:extra_params) { {} }
10
+
11
+ context "when target.notification_action_cable_with_devise? returns true" do
12
+ before do
13
+ @user_notification_action_cable_with_devise = User._notification_action_cable_with_devise
14
+ User._notification_action_cable_with_devise = true
15
+ end
16
+
17
+ after do
18
+ User._notification_action_cable_with_devise = @user_notification_action_cable_with_devise
19
+ end
20
+
21
+ it "rejects subscription even if target_type and target_id parameters are passed" do
22
+ subscribe({ target_type: target_type, target_id: test_target.id })
23
+ expect(subscription).to be_rejected
24
+ expect {
25
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
26
+ }.to raise_error(/Must be subscribed!/)
27
+ end
28
+ end
29
+
30
+ context "when target.notification_action_cable_with_devise? returns false" do
31
+ before do
32
+ @user_notification_action_cable_with_devise = User._notification_action_cable_with_devise
33
+ User._notification_action_cable_with_devise = false
34
+ @auth_headers = {}
35
+ end
36
+
37
+ after do
38
+ User._notification_action_cable_with_devise = @user_notification_action_cable_with_devise
39
+ end
40
+
41
+ it "successfully subscribes with target_type and target_id parameters" do
42
+ subscribe({ target_type: target_type, target_id: test_target.id })
43
+ expect(subscription).to be_confirmed
44
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
45
+ expect(subscription).to have_stream_from("activity_notification_api_channel_User##{test_target.id}")
46
+ end
47
+
48
+ it_behaves_like :notification_api_channel
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,78 @@
1
+ if Rails::VERSION::MAJOR >= 5
2
+ require 'channels/notification_api_channel_shared_examples'
3
+
4
+ # @See https://github.com/palkan/action-cable-testing
5
+ describe ActivityNotification::NotificationApiWithDeviseChannel, type: :channel do
6
+ let(:test_user) { create(:confirmed_user) }
7
+ let(:unauthenticated_user) { create(:confirmed_user) }
8
+ let(:test_target) { create(:admin, user: test_user) }
9
+ let(:target_type) { "Admin" }
10
+ let(:typed_target_param) { "admin_id" }
11
+ let(:extra_params) { { devise_type: :users } }
12
+ let(:valid_session) {}
13
+
14
+ # @See https://github.com/lynndylanhurley/devise_token_auth
15
+ def sign_in(current_target)
16
+ @auth_headers = current_target.create_new_auth_token
17
+ end
18
+
19
+ before do
20
+ @user_notification_action_cable_with_devise = User._notification_action_cable_with_devise
21
+ User._notification_action_cable_with_devise = true
22
+ end
23
+
24
+ after do
25
+ User._notification_action_cable_with_devise = @user_notification_action_cable_with_devise
26
+ end
27
+
28
+ context "signed in with devise as authenticated user" do
29
+ before do
30
+ sign_in test_user
31
+ end
32
+
33
+ it_behaves_like :notification_api_channel
34
+ end
35
+
36
+ context "signed in with devise as unauthenticated user" do
37
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
38
+
39
+ before do
40
+ sign_in unauthenticated_user
41
+ end
42
+
43
+ it "rejects subscription" do
44
+ subscribe(target_params.merge({ typed_target_param => test_target }).merge(@auth_headers))
45
+ expect(subscription).to be_rejected
46
+ expect {
47
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
48
+ }.to raise_error(/Must be subscribed!/)
49
+ end
50
+ end
51
+
52
+ context "unsigned in with devise" do
53
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
54
+
55
+ it "rejects subscription" do
56
+ subscribe(target_params.merge({ typed_target_param => test_target }))
57
+ expect(subscription).to be_rejected
58
+ expect {
59
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
60
+ }.to raise_error(/Must be subscribed!/)
61
+ end
62
+ end
63
+
64
+ context "without target_id and (typed_target)_id parameters for devise integrated channel with devise_type option" do
65
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
66
+
67
+ before do
68
+ sign_in test_target.user
69
+ end
70
+
71
+ it "successfully subscribes" do
72
+ subscribe(target_params.merge(@auth_headers))
73
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_api_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
74
+ expect(subscription).to have_stream_from("activity_notification_api_channel_Admin##{test_target.id}")
75
+ end
76
+ end
77
+ end
78
+ end
@@ -123,6 +123,24 @@ shared_examples_for :notification_api do
123
123
  end
124
124
  end
125
125
  end
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
+ it "generates notifications even if some optional targets raise error" do
140
+ notifications = described_class.notify(:users, @comment_2)
141
+ expect(notifications.size).to eq(2)
142
+ end
143
+ end
126
144
  end
127
145
 
128
146
  describe ".notify_later" do
@@ -465,13 +483,14 @@ shared_examples_for :notification_api do
465
483
  describe ".open_all_of" do
466
484
  before do
467
485
  described_class.notify_to(@user_1, @article, group: @article, key: 'key.1')
486
+ sleep(0.01)
468
487
  described_class.notify_to(@user_1, @comment_2, group: @comment_2, key: 'key.2')
469
488
  expect(@user_1.notifications.unopened_only.count).to eq(2)
470
489
  expect(@user_1.notifications.opened_only!.count).to eq(0)
471
490
  end
472
491
 
473
- it "returns the number of opened notification records" do
474
- expect(described_class.open_all_of(@user_1)).to eq(2)
492
+ it "returns array of opened notification records" do
493
+ expect(described_class.open_all_of(@user_1).size).to eq(2)
475
494
  end
476
495
 
477
496
  it "opens all notifications of the target" do
@@ -534,6 +553,22 @@ shared_examples_for :notification_api do
534
553
  expect(@user_1.notifications.opened_only!.count).to eq(1)
535
554
  end
536
555
  end
556
+
557
+ context 'with later_than options' do
558
+ it "opens filtered notifications only" do
559
+ described_class.open_all_of(@user_1, { later_than: (@user_1.notifications.earliest.created_at.in_time_zone + 0.001).iso8601(3) })
560
+ expect(@user_1.notifications.unopened_only.count).to eq(1)
561
+ expect(@user_1.notifications.opened_only!.count).to eq(1)
562
+ end
563
+ end
564
+
565
+ context 'with earlier_than options' do
566
+ it "opens filtered notifications only" do
567
+ described_class.open_all_of(@user_1, { earlier_than: @user_1.notifications.latest.created_at.iso8601(3) })
568
+ expect(@user_1.notifications.unopened_only.count).to eq(1)
569
+ expect(@user_1.notifications.opened_only!.count).to eq(1)
570
+ end
571
+ end
537
572
  end
538
573
 
539
574
  describe ".group_member_exists?" do