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,506 @@
1
+ require_relative 'controller_spec_utility'
2
+
3
+ shared_examples_for :notifications_api_controller do
4
+ include ActivityNotification::ControllerSpec::RequestUtility
5
+ include ActivityNotification::ControllerSpec::ApiResponseUtility
6
+
7
+ let(:target_params) { { target_type: target_type }.merge(extra_params || {}) }
8
+
9
+ describe "GET #index" do
10
+ context "with target_type and target_id parameters" do
11
+ before do
12
+ @notification = create(:notification, target: test_target)
13
+ get_with_compatibility :index, target_params.merge({ target_id: test_target, typed_target_param => 'dummy' }), valid_session
14
+ end
15
+
16
+ it "returns 200 as http status code" do
17
+ expect(response.status).to eq(200)
18
+ end
19
+
20
+ it "returns JSON response" do
21
+ expect(response_json["count"]).to eq(1)
22
+ assert_json_with_object_array(response_json["notifications"], [@notification])
23
+ end
24
+ end
25
+
26
+ context "with target_type and (typed_target)_id parameters" do
27
+ before do
28
+ @notification = create(:notification, target: test_target)
29
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target }), valid_session
30
+ end
31
+
32
+ it "returns 200 as http status code" do
33
+ expect(response.status).to eq(200)
34
+ end
35
+ end
36
+
37
+ context "without target_type parameters" do
38
+ before do
39
+ @notification = create(:notification, target: test_target)
40
+ get_with_compatibility :index, { typed_target_param => test_target }, valid_session
41
+ end
42
+
43
+ it "returns 400 as http status code" do
44
+ expect(response.status).to eq(400)
45
+ end
46
+
47
+ it "returns error JSON response" do
48
+ assert_error_response(400)
49
+ end
50
+ end
51
+
52
+ context "with not found (typed_target)_id parameter" do
53
+ before do
54
+ @notification = create(:notification, target: test_target)
55
+ get_with_compatibility :index, target_params.merge({ typed_target_param => 0 }), valid_session
56
+ end
57
+
58
+ it "returns 404 as http status code" do
59
+ expect(response.status).to eq(404)
60
+ end
61
+
62
+ it "returns error JSON response" do
63
+ assert_error_response(404)
64
+ end
65
+ end
66
+
67
+ context "with filter parameter" do
68
+ context "with unopened as filter" do
69
+ before do
70
+ @notification = create(:notification, target: test_target)
71
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target, filter: 'unopened' }), valid_session
72
+ end
73
+
74
+ it "returns unopened notification index as JSON" do
75
+ assert_json_with_object_array(response_json["notifications"], [@notification])
76
+ end
77
+ end
78
+
79
+ context "with opened as filter" do
80
+ before do
81
+ @notification = create(:notification, target: test_target)
82
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target, filter: 'opened' }), valid_session
83
+ end
84
+
85
+ it "returns unopened notification index as JSON" do
86
+ assert_json_with_object_array(response_json["notifications"], [])
87
+ end
88
+ end
89
+ end
90
+
91
+ context "with limit parameter" do
92
+ before do
93
+ create(:notification, target: test_target)
94
+ create(:notification, target: test_target)
95
+ end
96
+ context "with 2 as limit" do
97
+ before do
98
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target, limit: 2 }), valid_session
99
+ end
100
+
101
+ it "returns notification index of size 2 as JSON" do
102
+ assert_json_with_array_size(response_json["notifications"], 2)
103
+ end
104
+ end
105
+
106
+ context "with 1 as limit" do
107
+ before do
108
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target, limit: 1 }), valid_session
109
+ end
110
+
111
+ it "returns notification index of size 1 as JSON" do
112
+ assert_json_with_array_size(response_json["notifications"], 1)
113
+ end
114
+ end
115
+ end
116
+
117
+ context "with reverse parameter" do
118
+ before do
119
+ @notifiable = create(:article)
120
+ @group = create(:article)
121
+ @key = 'test.key.1'
122
+ notification = create(:notification, target: test_target, notifiable: @notifiable)
123
+ create(:notification, target: test_target, notifiable: create(:comment), group: @group, created_at: notification.created_at + 10.second)
124
+ create(:notification, target: test_target, notifiable: create(:article), key: @key, created_at: notification.created_at + 20.second).open!
125
+ @notification1 = test_target.notification_index[0]
126
+ @notification2 = test_target.notification_index[1]
127
+ @notification3 = test_target.notification_index[2]
128
+ end
129
+
130
+ context "as default" do
131
+ before do
132
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target }), valid_session
133
+ end
134
+
135
+ it "returns the latest order" do
136
+ assert_json_with_object_array(response_json["notifications"], [@notification1, @notification2, @notification3])
137
+ end
138
+ end
139
+
140
+ context "with true as reverse" do
141
+ before do
142
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target, reverse: true }), valid_session
143
+ end
144
+
145
+ it "returns the earliest order" do
146
+ assert_json_with_object_array(response_json["notifications"], [@notification2, @notification1, @notification3])
147
+ end
148
+ end
149
+ end
150
+
151
+ context "with options filter parameters" do
152
+ before do
153
+ @notifiable = create(:article)
154
+ @group = create(:article)
155
+ @key = 'test.key.1'
156
+ @notification2 = create(:notification, target: test_target, notifiable: @notifiable)
157
+ @notification1 = create(:notification, target: test_target, notifiable: create(:comment), group: @group, created_at: @notification2.created_at + 10.second)
158
+ @notification3 = create(:notification, target: test_target, notifiable: create(:article), key: @key, created_at: @notification2.created_at + 20.second)
159
+ @notification3.open!
160
+ end
161
+
162
+ context 'with filtered_by_type parameter' do
163
+ it "returns filtered notifications only" do
164
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target, filtered_by_type: 'Article' }), valid_session
165
+ assert_json_with_object_array(response_json["notifications"], [@notification2, @notification3])
166
+ end
167
+ end
168
+
169
+ context 'with filtered_by_group_type and filtered_by_group_id parameters' do
170
+ it "returns filtered notifications only" do
171
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target, filtered_by_group_type: 'Article', filtered_by_group_id: @group.id.to_s }), valid_session
172
+ assert_json_with_object_array(response_json["notifications"], [@notification1])
173
+ end
174
+ end
175
+
176
+ context 'with filtered_by_key parameter' do
177
+ it "returns filtered notifications only" do
178
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target, filtered_by_key: @key }), valid_session
179
+ assert_json_with_object_array(response_json["notifications"], [@notification3])
180
+ end
181
+ end
182
+
183
+ context 'with later_than parameter' do
184
+ it "returns filtered notifications only" do
185
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target, later_than: (@notification1.created_at.in_time_zone + 0.001).iso8601(3) }), valid_session
186
+ assert_json_with_object_array(response_json["notifications"], [@notification3])
187
+ end
188
+ end
189
+
190
+ context 'with earlier_than parameter' do
191
+ it "returns filtered notifications only" do
192
+ get_with_compatibility :index, target_params.merge({ typed_target_param => test_target, earlier_than: @notification1.created_at.iso8601(3) }), valid_session
193
+ assert_json_with_object_array(response_json["notifications"], [@notification2])
194
+ end
195
+ end
196
+ end
197
+ end
198
+
199
+ describe "POST #open_all" do
200
+ context "http POST request" do
201
+ before do
202
+ @notification = create(:notification, target: test_target)
203
+ expect(@notification.opened?).to be_falsey
204
+ post_with_compatibility :open_all, target_params.merge({ typed_target_param => test_target }), valid_session
205
+ end
206
+
207
+ it "returns 200 as http status code" do
208
+ expect(response.status).to eq(200)
209
+ end
210
+
211
+ it "opens all notifications of the target" do
212
+ expect(@notification.reload.opened?).to be_truthy
213
+ end
214
+
215
+ it "returns JSON response" do
216
+ expect(response_json["count"]).to eq(1)
217
+ assert_json_with_object_array(response_json["notifications"], [@notification])
218
+ end
219
+ end
220
+
221
+ context "with filter request parameters" do
222
+ before do
223
+ @target_1, @notifiable_1, @group_1, @key_1 = create(:confirmed_user), create(:article), nil, "key.1"
224
+ @target_2, @notifiable_2, @group_2, @key_2 = create(:confirmed_user), create(:comment), @notifiable_1, "key.2"
225
+ @notification_1 = create(:notification, target: test_target, notifiable: @notifiable_1, group: @group_1, key: @key_1)
226
+ @notification_2 = create(:notification, target: test_target, notifiable: @notifiable_2, group: @group_2, key: @key_2, created_at: @notification_1.created_at + 10.second)
227
+ expect(@notification_1.opened?).to be_falsey
228
+ expect(@notification_2.opened?).to be_falsey
229
+ end
230
+
231
+ context "with filtered_by_type request parameters" do
232
+ it "opens filtered notifications only" do
233
+ post_with_compatibility :open_all, target_params.merge({ typed_target_param => test_target, 'filtered_by_type' => @notifiable_2.to_class_name }), valid_session
234
+ expect(@notification_1.reload.opened?).to be_falsey
235
+ expect(@notification_2.reload.opened?).to be_truthy
236
+ end
237
+ end
238
+
239
+ context 'with filtered_by_group_type and :filtered_by_group_id request parameters' do
240
+ it "opens filtered notifications only" do
241
+ post_with_compatibility :open_all, target_params.merge({ typed_target_param => test_target, 'filtered_by_group_type' => 'Article', 'filtered_by_group_id' => @group_2.id.to_s }), valid_session
242
+ expect(@notification_1.reload.opened?).to be_falsey
243
+ expect(@notification_2.reload.opened?).to be_truthy
244
+ end
245
+ end
246
+
247
+ context 'with filtered_by_key request parameters' do
248
+ it "opens filtered notifications only" do
249
+ post_with_compatibility :open_all, target_params.merge({ typed_target_param => test_target, 'filtered_by_key' => 'key.2' }), valid_session
250
+ expect(@notification_1.reload.opened?).to be_falsey
251
+ expect(@notification_2.reload.opened?).to be_truthy
252
+ end
253
+ end
254
+
255
+ context 'with later_than parameter' do
256
+ it "opens filtered notifications only" do
257
+ post_with_compatibility :open_all, target_params.merge({ typed_target_param => test_target, later_than: (@notification_1.created_at.in_time_zone + 0.001).iso8601(3) }), valid_session
258
+ expect(@notification_1.reload.opened?).to be_falsey
259
+ expect(@notification_2.reload.opened?).to be_truthy
260
+ end
261
+ end
262
+
263
+ context 'with earlier_than parameter' do
264
+ it "opens filtered notifications only" do
265
+ post_with_compatibility :open_all, target_params.merge({ typed_target_param => test_target, earlier_than: @notification_2.created_at.iso8601(3) }), valid_session
266
+ expect(@notification_1.reload.opened?).to be_truthy
267
+ expect(@notification_2.reload.opened?).to be_falsey
268
+ end
269
+ end
270
+
271
+ context "with no filter request parameters" do
272
+ it "opens all notifications of the target" do
273
+ post_with_compatibility :open_all, target_params.merge({ typed_target_param => test_target}), valid_session
274
+ expect(@notification_1.reload.opened?).to be_truthy
275
+ expect(@notification_2.reload.opened?).to be_truthy
276
+ end
277
+ end
278
+ end
279
+ end
280
+
281
+ describe "GET #show" do
282
+ context "with id, target_type and (typed_target)_id parameters" do
283
+ before do
284
+ @notification = create(:notification, target: test_target)
285
+ get_with_compatibility :show, target_params.merge({ id: @notification, typed_target_param => test_target }), valid_session
286
+ end
287
+
288
+ it "returns 200 as http status code" do
289
+ expect(response.status).to eq(200)
290
+ end
291
+
292
+ it "returns the requested notification as JSON" do
293
+ assert_json_with_object(response_json, @notification)
294
+ end
295
+ end
296
+
297
+ context "with wrong id and (typed_target)_id parameters" do
298
+ before do
299
+ @notification = create(:notification, target: create(:user))
300
+ get_with_compatibility :show, target_params.merge({ id: @notification, typed_target_param => test_target }), valid_session
301
+ end
302
+
303
+ it "returns 403 as http status code" do
304
+ expect(response.status).to eq(403)
305
+ end
306
+
307
+ it "returns error JSON response" do
308
+ assert_error_response(403)
309
+ end
310
+ end
311
+
312
+ context "when associated notifiable record was not found" do
313
+ before do
314
+ @notification = create(:notification, target: test_target)
315
+ @notification.notifiable.delete
316
+ get_with_compatibility :show, target_params.merge({ id: @notification, typed_target_param => test_target }), valid_session
317
+ end
318
+
319
+ it "returns 500 as http status code" do
320
+ expect(response.status).to eq(500)
321
+ end
322
+
323
+ it "returns error JSON response" do
324
+ assert_error_response(500)
325
+ end
326
+ end
327
+ end
328
+
329
+ describe "DELETE #destroy" do
330
+ context "http DELETE request" do
331
+ before do
332
+ @notification = create(:notification, target: test_target)
333
+ delete_with_compatibility :destroy, target_params.merge({ id: @notification, typed_target_param => test_target }), valid_session
334
+ end
335
+
336
+ it "returns 204 as http status code" do
337
+ expect(response.status).to eq(204)
338
+ end
339
+
340
+ it "deletes the notification" do
341
+ expect(test_target.notifications.where(id: @notification.id).exists?).to be_falsey
342
+ end
343
+ end
344
+ end
345
+
346
+ describe "PUT #open" do
347
+ context "without move parameter" do
348
+ context "http PUT request" do
349
+ before do
350
+ @notification = create(:notification, target: test_target)
351
+ expect(@notification.opened?).to be_falsey
352
+ put_with_compatibility :open, target_params.merge({ id: @notification, typed_target_param => test_target }), valid_session
353
+ end
354
+
355
+ it "returns 200 as http status code" do
356
+ expect(response.status).to eq(200)
357
+ end
358
+
359
+ it "opens the notification" do
360
+ expect(@notification.reload.opened?).to be_truthy
361
+ end
362
+
363
+ it "returns JSON response" do
364
+ expect(response_json["count"]).to eq(1)
365
+ assert_json_with_object(response_json["notification"], @notification)
366
+ end
367
+ end
368
+ end
369
+
370
+ context "with true as move parameter" do
371
+ context "http PUT request" do
372
+ before do
373
+ @notification = create(:notification, target: test_target)
374
+ expect(@notification.opened?).to be_falsey
375
+ put_with_compatibility :open, target_params.merge({ id: @notification, typed_target_param => test_target, move: true }), valid_session
376
+ end
377
+
378
+ it "returns 302 as http status code" do
379
+ expect(response.status).to eq(302)
380
+ end
381
+
382
+ it "opens the notification" do
383
+ expect(@notification.reload.opened?).to be_truthy
384
+ end
385
+
386
+ it "redirects to notifiable_path" do
387
+ expect(response).to redirect_to @notification.notifiable_path
388
+ end
389
+ end
390
+ end
391
+ end
392
+
393
+ describe "GET #move" do
394
+ context "without open parameter" do
395
+ context "http GET request" do
396
+ before do
397
+ @notification = create(:notification, target: test_target)
398
+ get_with_compatibility :move, target_params.merge({ id: @notification, typed_target_param => test_target }), valid_session
399
+ end
400
+
401
+ it "returns 302 as http status code" do
402
+ expect(response.status).to eq(302)
403
+ end
404
+
405
+ it "redirects to notifiable_path" do
406
+ expect(response).to redirect_to @notification.notifiable_path
407
+ end
408
+ end
409
+ end
410
+
411
+ context "with true as open parameter" do
412
+ context "http GET request" do
413
+ before do
414
+ @notification = create(:notification, target: test_target)
415
+ expect(@notification.opened?).to be_falsey
416
+ get_with_compatibility :move, target_params.merge({ id: @notification, typed_target_param => test_target, open: true }), valid_session
417
+ end
418
+
419
+ it "returns 302 as http status code" do
420
+ expect(response.status).to eq(302)
421
+ end
422
+
423
+ it "opens the notification" do
424
+ expect(@notification.reload.opened?).to be_truthy
425
+ end
426
+
427
+ it "redirects to notifiable_path" do
428
+ expect(response).to redirect_to @notification.notifiable_path
429
+ end
430
+ end
431
+ end
432
+ end
433
+ end
434
+
435
+ shared_examples_for :notifications_api_request do
436
+ include ActivityNotification::ControllerSpec::CommitteeUtility
437
+
438
+ before do
439
+ group = create(:article)
440
+ notifier = create(:user)
441
+ create(:notification, target: test_target)
442
+ group_owner = create(:notification, target: test_target, group: group, notifier: notifier, parameters: { "test_default_param": "1" })
443
+ @notification = create(:notification, target: test_target, group: group, group_owner: group_owner, notifier: notifier, parameters: { "test_default_param": "1" })
444
+ group_owner.open!
445
+ end
446
+
447
+ describe "GET /apidocs" do
448
+ it "returns API references as OpenAPI Specification JSON schema" do
449
+ get "#{root_path}/apidocs"
450
+ write_schema_file(response.body)
451
+ expect(read_schema_file["openapi"]).to eq("3.0.0")
452
+ end
453
+ end
454
+
455
+ describe "GET /{target_type}/{target_id}/notifications", type: :request do
456
+ it "returns response as API references" do
457
+ get_with_compatibility "#{api_path}/notifications", headers: @headers
458
+ assert_all_schema_confirm(response, 200)
459
+ end
460
+ end
461
+
462
+ describe "POST /{target_type}/{target_id}/notifications/open_all", type: :request do
463
+ it "returns response as API references" do
464
+ post_with_compatibility "#{api_path}/notifications/open_all", headers: @headers
465
+ assert_all_schema_confirm(response, 200)
466
+ end
467
+ end
468
+
469
+ describe "GET /{target_type}/{target_id}/notifications/{id}", type: :request do
470
+ it "returns response as API references" do
471
+ get_with_compatibility "#{api_path}/notifications/#{@notification.id}", headers: @headers
472
+ assert_all_schema_confirm(response, 200)
473
+ end
474
+
475
+ it "returns error response as API references" do
476
+ get_with_compatibility "#{api_path}/notifications/0", headers: @headers
477
+ assert_all_schema_confirm(response, 404)
478
+ end
479
+ end
480
+
481
+ describe "DELETE /{target_type}/{target_id}/notifications/{id}", type: :request do
482
+ it "returns response as API references" do
483
+ delete_with_compatibility "#{api_path}/notifications/#{@notification.id}", headers: @headers
484
+ assert_all_schema_confirm(response, 204)
485
+ end
486
+ end
487
+
488
+ describe "PUT /{target_type}/{target_id}/notifications/{id}/open", type: :request do
489
+ it "returns response as API references" do
490
+ put_with_compatibility "#{api_path}/notifications/#{@notification.id}/open", headers: @headers
491
+ assert_all_schema_confirm(response, 200)
492
+ end
493
+
494
+ it "returns response as API references when request parameters have move=true" do
495
+ put_with_compatibility "#{api_path}/notifications/#{@notification.id}/open?move=true", headers: @headers
496
+ assert_all_schema_confirm(response, 302)
497
+ end
498
+ end
499
+
500
+ describe "GET /{target_type}/{target_id}/notifications/{id}/move", type: :request do
501
+ it "returns response as API references" do
502
+ get_with_compatibility "#{api_path}/notifications/#{@notification.id}/move", headers: @headers
503
+ assert_all_schema_confirm(response, 302)
504
+ end
505
+ end
506
+ end
@@ -0,0 +1,19 @@
1
+ require 'controllers/notifications_api_controller_shared_examples'
2
+
3
+ describe ActivityNotification::NotificationsApiController, type: :controller do
4
+ let(:test_target) { create(:user) }
5
+ let(:target_type) { :users }
6
+ let(:typed_target_param) { :user_id }
7
+ let(:extra_params) { {} }
8
+ let(:valid_session) {}
9
+
10
+ it_behaves_like :notifications_api_controller
11
+
12
+ describe "/api/v#{ActivityNotification::GEM_VERSION::MAJOR}", type: :request do
13
+ let(:root_path) { "/api/v#{ActivityNotification::GEM_VERSION::MAJOR}" }
14
+ let(:test_target) { create(:user) }
15
+ let(:target_type) { :users }
16
+
17
+ it_behaves_like :notifications_api_request
18
+ end
19
+ end
@@ -0,0 +1,60 @@
1
+ require 'controllers/notifications_api_controller_shared_examples'
2
+
3
+ context "ActivityNotification::NotificationsApiWithDeviseController" do
4
+ context "test admins API with associated users authentication" do
5
+
6
+ describe "/api/v#{ActivityNotification::GEM_VERSION::MAJOR}", type: :request do
7
+ include ActivityNotification::ControllerSpec::CommitteeUtility
8
+
9
+ let(:root_path) { "/api/v#{ActivityNotification::GEM_VERSION::MAJOR}" }
10
+ let(:test_user) { create(:confirmed_user) }
11
+ let(:unauthenticated_user) { create(:confirmed_user) }
12
+ let(:test_target) { create(:admin, user: test_user) }
13
+ let(:target_type) { :admins }
14
+
15
+ def sign_in_with_devise_token_auth(auth_user, status)
16
+ post_with_compatibility "#{root_path}/auth/sign_in", params: { email: auth_user.email, password: "password" }
17
+ expect(response).to have_http_status(status)
18
+ @headers = response.header.slice("access-token", "client", "uid")
19
+ end
20
+
21
+ context "signed in with devise as authenticated user" do
22
+ before do
23
+ sign_in_with_devise_token_auth(test_user, 200)
24
+ end
25
+
26
+ it_behaves_like :notifications_api_request
27
+ end
28
+
29
+ context "signed in with devise as unauthenticated user" do
30
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
31
+
32
+ describe "GET #index" do
33
+ before do
34
+ sign_in_with_devise_token_auth(unauthenticated_user, 200)
35
+ get_with_compatibility "#{api_path}/notifications", headers: @headers
36
+ end
37
+
38
+ it "returns 403 as http status code" do
39
+ expect(response.status).to eq(403)
40
+ end
41
+ end
42
+ end
43
+
44
+ context "unsigned in with devise" do
45
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
46
+
47
+ describe "GET #index" do
48
+ before do
49
+ get_with_compatibility "#{api_path}/notifications", headers: @headers
50
+ end
51
+
52
+ it "returns 401 as http status code" do
53
+ expect(response.status).to eq(401)
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ end
60
+ end