activity_notification 1.7.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -0
  3. data/.travis.yml +16 -2
  4. data/CHANGELOG.md +22 -2
  5. data/Gemfile +7 -0
  6. data/Procfile +2 -0
  7. data/README.md +366 -32
  8. data/Rakefile +19 -10
  9. data/activity_notification.gemspec +5 -3
  10. data/app/channels/activity_notification/notification_channel.rb +37 -0
  11. data/app/channels/activity_notification/notification_with_devise_channel.rb +51 -0
  12. data/app/controllers/activity_notification/notifications_controller.rb +1 -1
  13. data/app/controllers/activity_notification/subscriptions_controller.rb +1 -1
  14. data/app/jobs/activity_notification/notify_all_job.rb +16 -0
  15. data/app/jobs/activity_notification/notify_job.rb +17 -0
  16. data/app/jobs/activity_notification/notify_to_job.rb +16 -0
  17. data/app/views/activity_notification/notifications/default/_default_without_grouping.html.erb +1 -1
  18. data/app/views/activity_notification/notifications/default/index.html.erb +55 -2
  19. data/bin/_dynamodblocal +4 -0
  20. data/{scripts → bin}/bundle_update.sh +1 -0
  21. data/bin/deploy_on_heroku.sh +14 -0
  22. data/bin/install_dynamodblocal.sh +5 -0
  23. data/bin/start_dynamodblocal.sh +47 -0
  24. data/bin/stop_dynamodblocal.sh +34 -0
  25. data/gemfiles/Gemfile.rails-4.2 +1 -0
  26. data/gemfiles/Gemfile.rails-5.0 +2 -0
  27. data/gemfiles/Gemfile.rails-5.1 +1 -0
  28. data/gemfiles/Gemfile.rails-5.2 +1 -0
  29. data/gemfiles/Gemfile.rails-6.0.rc +21 -0
  30. data/lib/activity_notification.rb +1 -0
  31. data/lib/activity_notification/apis/notification_api.rb +289 -136
  32. data/lib/activity_notification/apis/subscription_api.rb +80 -53
  33. data/lib/activity_notification/common.rb +3 -3
  34. data/lib/activity_notification/config.rb +89 -33
  35. data/lib/activity_notification/controllers/common_controller.rb +19 -7
  36. data/lib/activity_notification/helpers/errors.rb +4 -0
  37. data/lib/activity_notification/helpers/view_helpers.rb +1 -1
  38. data/lib/activity_notification/models/concerns/notifiable.rb +61 -53
  39. data/lib/activity_notification/models/concerns/subscriber.rb +7 -6
  40. data/lib/activity_notification/models/concerns/target.rb +73 -28
  41. data/lib/activity_notification/optional_targets/base.rb +2 -2
  42. data/lib/activity_notification/orm/active_record/notification.rb +4 -23
  43. data/lib/activity_notification/orm/dynamoid.rb +495 -0
  44. data/lib/activity_notification/orm/dynamoid/extension.rb +184 -0
  45. data/lib/activity_notification/orm/dynamoid/notification.rb +189 -0
  46. data/lib/activity_notification/orm/dynamoid/subscription.rb +82 -0
  47. data/lib/activity_notification/orm/mongoid.rb +4 -1
  48. data/lib/activity_notification/orm/mongoid/notification.rb +8 -25
  49. data/lib/activity_notification/orm/mongoid/subscription.rb +1 -1
  50. data/lib/activity_notification/roles/acts_as_notifiable.rb +33 -5
  51. data/lib/activity_notification/roles/acts_as_target.rb +62 -9
  52. data/lib/activity_notification/version.rb +1 -1
  53. data/lib/generators/templates/activity_notification.rb +30 -7
  54. data/lib/tasks/activity_notification_tasks.rake +14 -4
  55. data/spec/channels/notification_channel_shared_examples.rb +59 -0
  56. data/spec/channels/notification_channel_spec.rb +50 -0
  57. data/spec/channels/notification_with_devise_channel_spec.rb +99 -0
  58. data/spec/concerns/apis/notification_api_spec.rb +2 -2
  59. data/spec/concerns/apis/subscription_api_spec.rb +2 -2
  60. data/spec/concerns/models/notifiable_spec.rb +72 -7
  61. data/spec/concerns/models/subscriber_spec.rb +53 -49
  62. data/spec/concerns/models/target_spec.rb +135 -13
  63. data/spec/config_spec.rb +41 -1
  64. data/spec/controllers/notifications_controller_shared_examples.rb +7 -3
  65. data/spec/controllers/subscriptions_controller_shared_examples.rb +7 -3
  66. data/spec/helpers/view_helpers_spec.rb +12 -10
  67. data/spec/models/dummy/dummy_group_spec.rb +4 -0
  68. data/spec/models/dummy/dummy_notifiable_spec.rb +4 -0
  69. data/spec/models/dummy/dummy_notifier_spec.rb +4 -0
  70. data/spec/models/dummy/dummy_subscriber_spec.rb +3 -0
  71. data/spec/models/dummy/dummy_target_spec.rb +4 -0
  72. data/spec/models/notification_spec.rb +164 -45
  73. data/spec/models/subscription_spec.rb +69 -14
  74. data/spec/orm/dynamoid_spec.rb +115 -0
  75. data/spec/rails_app/app/assets/javascripts/application.js +2 -1
  76. data/spec/rails_app/app/assets/javascripts/cable.js +12 -0
  77. data/spec/rails_app/app/controllers/comments_controller.rb +3 -4
  78. data/spec/rails_app/app/models/admin.rb +6 -4
  79. data/spec/rails_app/app/models/article.rb +2 -2
  80. data/spec/rails_app/app/models/comment.rb +17 -5
  81. data/spec/rails_app/app/models/user.rb +5 -3
  82. data/spec/rails_app/app/views/activity_notification/notifications/users/overridden/custom/_test.html.erb +1 -0
  83. data/spec/rails_app/config/application.rb +6 -1
  84. data/spec/rails_app/config/cable.yml +8 -0
  85. data/spec/rails_app/config/dynamoid.rb +5 -0
  86. data/spec/rails_app/config/environment.rb +4 -1
  87. data/spec/rails_app/config/environments/production.rb +1 -1
  88. data/spec/rails_app/config/initializers/activity_notification.rb +30 -7
  89. data/spec/rails_app/config/locales/activity_notification.en.yml +2 -0
  90. data/spec/rails_app/db/seeds.rb +21 -5
  91. data/spec/rails_app/lib/mailer_previews/mailer_preview.rb +12 -4
  92. data/spec/roles/acts_as_notifiable_spec.rb +2 -2
  93. data/spec/roles/acts_as_target_spec.rb +1 -1
  94. data/spec/spec_helper.rb +15 -8
  95. metadata +67 -20
  96. data/spec/rails_app/app/models/.keep +0 -0
  97. data/spec/rails_app/app/views/activity_notification/notifications/users/overriden/custom/_test.html.erb +0 -1
@@ -0,0 +1,99 @@
1
+ if Rails::VERSION::MAJOR >= 5
2
+ require 'channels/notification_channel_shared_examples'
3
+
4
+ #TODO Make it more smart test method
5
+ module ActivityNotification
6
+ module Test
7
+ class NotificationWithDeviseChannel < ::ActivityNotification::NotificationWithDeviseChannel
8
+ @@custom_current_target = nil
9
+
10
+ def set_custom_current_target(custom_current_target)
11
+ @@custom_current_target = custom_current_target
12
+ end
13
+
14
+ def find_current_target(devise_type = nil)
15
+ super(devise_type)
16
+ rescue NoMethodError
17
+ devise_type = (devise_type || @target.notification_devise_resource.class.name).to_s
18
+ @@custom_current_target.is_a?(devise_type.to_model_class) ? @@custom_current_target : nil
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ # @See https://github.com/palkan/action-cable-testing
25
+ describe ActivityNotification::Test::NotificationWithDeviseChannel, type: :channel do
26
+ let(:test_user) { create(:confirmed_user) }
27
+ let(:unauthenticated_user) { create(:confirmed_user) }
28
+ let(:test_target) { create(:admin, user: test_user) }
29
+ let(:target_type) { "Admin" }
30
+ let(:typed_target_param) { "admin_id" }
31
+ let(:extra_params) { { devise_type: :users } }
32
+ let(:valid_session) {}
33
+
34
+ #TODO Make it more smart test method
35
+ #include Devise::Test::IntegrationHelpers
36
+ def sign_in(current_target)
37
+ described_class.new(ActionCable::Channel::ConnectionStub.new, {}).set_custom_current_target(current_target)
38
+ end
39
+
40
+ before do
41
+ @user_notification_action_cable_with_devise = User._notification_action_cable_with_devise
42
+ User._notification_action_cable_with_devise = true
43
+ end
44
+
45
+ after do
46
+ User._notification_action_cable_with_devise = @user_notification_action_cable_with_devise
47
+ end
48
+
49
+ context "signed in with devise as authenticated user" do
50
+ before do
51
+ sign_in test_user
52
+ end
53
+
54
+ it_behaves_like :notification_channel
55
+ end
56
+
57
+ context "signed in with devise as unauthenticated user" do
58
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
59
+
60
+ before do
61
+ sign_in unauthenticated_user
62
+ end
63
+
64
+ it "rejects subscription" do
65
+ subscribe(target_params.merge({ typed_target_param => test_target }))
66
+ expect(subscription).to be_rejected
67
+ expect {
68
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
69
+ }.to raise_error(/Must be subscribed!/)
70
+ end
71
+ end
72
+
73
+ context "unsigned in with devise" do
74
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
75
+
76
+ it "rejects subscription" do
77
+ subscribe(target_params.merge({ typed_target_param => test_target }))
78
+ expect(subscription).to be_rejected
79
+ expect {
80
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
81
+ }.to raise_error(/Must be subscribed!/)
82
+ end
83
+ end
84
+
85
+ context "without target_id and (typed_target)_id parameters for devise integrated channel with devise_type option" do
86
+ let(:target_params) { { target_type: target_type, devise_type: :users } }
87
+
88
+ before do
89
+ sign_in test_target.user
90
+ end
91
+
92
+ it "successfully subscribes" do
93
+ subscribe(target_params)
94
+ expect(subscription).to have_stream_from("#{ActivityNotification.config.notification_channel_prefix}_#{test_target.to_class_name}#{ActivityNotification.config.composite_key_delimiter}#{test_target.id}")
95
+ expect(subscription).to have_stream_from("activity_notification_channel_Admin##{test_target.id}")
96
+ end
97
+ end
98
+ end
99
+ end
@@ -308,7 +308,7 @@ shared_examples_for :notification_api do
308
308
  end
309
309
 
310
310
  it "has parameters of notifiable.notification_parameters" do
311
- expect(created_notification.parameters)
311
+ expect(created_notification.parameters.stringify_keys)
312
312
  .to eq(
313
313
  created_notification.notifiable.notification_parameters(
314
314
  @user_1.class,
@@ -605,7 +605,7 @@ shared_examples_for :notification_api do
605
605
  describe ".available_options" do
606
606
  it "returns list of available options in notify api" do
607
607
  expect(described_class.available_options)
608
- .to eq([:key, :group, :parameters, :notifier, :send_email, :send_later])
608
+ .to eq([:key, :group, :group_expiry_delay, :notifier, :parameters, :send_email, :send_later])
609
609
  end
610
610
  end
611
611
  end
@@ -279,7 +279,7 @@ shared_examples_for :subscription_api do
279
279
  test_instance.subscribe_to_optional_target(:console_output)
280
280
  expect(test_instance.subscribing?).to eq(true)
281
281
  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)
282
+ expect(test_instance.optional_targets[:subscribed_to_console_output_at]).to eq(ActivityNotification::Subscription.convert_time_as_hash(Time.current))
283
283
  Timecop.return
284
284
  end
285
285
  end
@@ -310,7 +310,7 @@ shared_examples_for :subscription_api do
310
310
  test_instance.unsubscribe_to_optional_target(:console_output)
311
311
  expect(test_instance.subscribing?).to eq(true)
312
312
  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)
313
+ expect(test_instance.optional_targets[:unsubscribed_to_console_output_at]).to eq(ActivityNotification::Subscription.convert_time_as_hash(Time.current))
314
314
  Timecop.return
315
315
  end
316
316
  end
@@ -21,6 +21,7 @@ shared_examples_for :notifiable do
21
21
  expect(described_class._notifier).to eq({})
22
22
  expect(described_class._notification_parameters).to eq({})
23
23
  expect(described_class._notification_email_allowed).to eq({})
24
+ expect(described_class._notification_action_cable_allowed).to eq({})
24
25
  expect(described_class._notifiable_path).to eq({})
25
26
  expect(described_class._printable_notifiable_name).to eq({})
26
27
  end
@@ -47,7 +48,7 @@ shared_examples_for :notifiable do
47
48
  end
48
49
  end
49
50
 
50
- context "configured with overriden method" do
51
+ context "configured with overridden method" do
51
52
  it "returns specified value" do
52
53
  module AdditionalMethods
53
54
  def notification_users(key)
@@ -116,7 +117,7 @@ shared_examples_for :notifiable do
116
117
  end
117
118
  end
118
119
 
119
- context "configured with overriden method" do
120
+ context "configured with overridden method" do
120
121
  it "returns specified value" do
121
122
  module AdditionalMethods
122
123
  def notification_group_for_users(key)
@@ -175,7 +176,7 @@ shared_examples_for :notifiable do
175
176
  end
176
177
  end
177
178
 
178
- context "configured with overriden method" do
179
+ context "configured with overridden method" do
179
180
  it "returns specified value" do
180
181
  module AdditionalMethods
181
182
  def notification_group_expiry_delay_for_users(key)
@@ -234,7 +235,7 @@ shared_examples_for :notifiable do
234
235
  end
235
236
  end
236
237
 
237
- context "configured with overriden method" do
238
+ context "configured with overridden method" do
238
239
  it "returns specified value" do
239
240
  module AdditionalMethods
240
241
  def notification_parameters_for_users(key)
@@ -293,7 +294,7 @@ shared_examples_for :notifiable do
293
294
  end
294
295
  end
295
296
 
296
- context "configured with overriden method" do
297
+ context "configured with overridden method" do
297
298
  it "returns specified value" do
298
299
  module AdditionalMethods
299
300
  def notifier_for_users(key)
@@ -357,7 +358,7 @@ shared_examples_for :notifiable do
357
358
  end
358
359
  end
359
360
 
360
- context "configured with overriden method" do
361
+ context "configured with overridden method" do
361
362
  it "returns specified value" do
362
363
  module AdditionalMethods
363
364
  def notification_email_allowed_for_users?(target, key)
@@ -409,6 +410,70 @@ shared_examples_for :notifiable do
409
410
  end
410
411
  end
411
412
 
413
+ describe "#notification_action_cable_allowed?" do
414
+ context "without any configuration" do
415
+ it "returns ActivityNotification.config.action_cable_enabled" do
416
+ expect(test_instance.notification_action_cable_allowed?(test_target, 'dummy_key'))
417
+ .to eq(ActivityNotification.config.action_cable_enabled)
418
+ end
419
+
420
+ it "returns false as default" do
421
+ expect(test_instance.notification_action_cable_allowed?(test_target, 'dummy_key')).to be_falsey
422
+ end
423
+ end
424
+
425
+ context "configured with overridden method" do
426
+ it "returns specified value" do
427
+ module AdditionalMethods
428
+ def notification_action_cable_allowed_for_users?(target, key)
429
+ true
430
+ end
431
+ end
432
+ test_instance.extend(AdditionalMethods)
433
+ expect(test_instance.notification_action_cable_allowed?(test_target, 'dummy_key')).to eq(true)
434
+ end
435
+ end
436
+
437
+ context "configured with a field" do
438
+ it "returns specified value" do
439
+ described_class._notification_action_cable_allowed[:users] = true
440
+ expect(test_instance.notification_action_cable_allowed?(test_target, 'dummy_key')).to eq(true)
441
+ end
442
+
443
+ it "returns specified symbol without arguments" do
444
+ module AdditionalMethods
445
+ def custom_notification_action_cable_allowed?
446
+ true
447
+ end
448
+ end
449
+ test_instance.extend(AdditionalMethods)
450
+ described_class._notification_action_cable_allowed[:users] = :custom_notification_action_cable_allowed?
451
+ expect(test_instance.notification_action_cable_allowed?(test_target, 'dummy_key')).to eq(true)
452
+ end
453
+
454
+ it "returns specified symbol with target and key arguments" do
455
+ module AdditionalMethods
456
+ def custom_notification_action_cable_allowed?(target, key)
457
+ true
458
+ end
459
+ end
460
+ test_instance.extend(AdditionalMethods)
461
+ described_class._notification_action_cable_allowed[:users] = :custom_notification_action_cable_allowed?
462
+ expect(test_instance.notification_action_cable_allowed?(test_target, 'dummy_key')).to eq(true)
463
+ end
464
+
465
+ it "returns specified lambda with single notifiable argument" do
466
+ described_class._notification_action_cable_allowed[:users] = ->(notifiable){ true }
467
+ expect(test_instance.notification_action_cable_allowed?(test_target, 'dummy_key')).to eq(true)
468
+ end
469
+
470
+ it "returns specified lambda with notifiable, target and key arguments" do
471
+ described_class._notification_action_cable_allowed[:users] = ->(notifiable, target, key){ true }
472
+ expect(test_instance.notification_action_cable_allowed?(test_target, 'dummy_key')).to eq(true)
473
+ end
474
+ end
475
+ end
476
+
412
477
  describe "#notifiable_path" do
413
478
  context "without any configuration" do
414
479
  it "raises NotImplementedError" do
@@ -424,7 +489,7 @@ shared_examples_for :notifiable do
424
489
  end
425
490
  end
426
491
 
427
- context "configured with overriden method" do
492
+ context "configured with overridden method" do
428
493
  it "returns specified value" do
429
494
  module AdditionalMethods
430
495
  def notifiable_path_for_users(key)
@@ -15,7 +15,7 @@ shared_examples_for :subscriber do
15
15
  expect(test_instance.subscriptions.count).to eq(2)
16
16
  expect(test_instance.subscriptions.earliest_order.first).to eq(subscription_1)
17
17
  expect(test_instance.subscriptions.latest_order.first).to eq(subscription_2)
18
- expect(test_instance.subscriptions.latest_order).to eq(ActivityNotification::Subscription.filtered_by_target(test_instance).latest_order)
18
+ expect(test_instance.subscriptions.latest_order.to_a).to eq(ActivityNotification::Subscription.filtered_by_target(test_instance).latest_order.to_a)
19
19
  end
20
20
  end
21
21
 
@@ -30,13 +30,13 @@ shared_examples_for :subscriber do
30
30
  describe "as public instance methods" do
31
31
  describe "#find_subscription" do
32
32
  before do
33
- expect(test_instance.subscriptions).to be_empty
33
+ expect(test_instance.subscriptions.to_a).to be_empty
34
34
  end
35
35
 
36
36
  context "when the cofigured subscription exists" do
37
37
  it "returns subscription record" do
38
38
  subscription = test_instance.create_subscription(key: 'test_key')
39
- expect(test_instance.subscriptions.reload).not_to be_empty
39
+ expect(test_instance.subscriptions.reload.to_a).not_to be_empty
40
40
  expect(test_instance.find_subscription('test_key')).to eq(subscription)
41
41
  end
42
42
  end
@@ -50,13 +50,13 @@ shared_examples_for :subscriber do
50
50
 
51
51
  describe "#find_or_create_subscription" do
52
52
  before do
53
- expect(test_instance.subscriptions).to be_empty
53
+ expect(test_instance.subscriptions.to_a).to be_empty
54
54
  end
55
55
 
56
56
  context "when the cofigured subscription exists" do
57
57
  it "returns subscription record" do
58
58
  subscription = test_instance.create_subscription(key: 'test_key')
59
- expect(test_instance.subscriptions.reload).not_to be_empty
59
+ expect(test_instance.subscriptions.reload.to_a).not_to be_empty
60
60
  expect(test_instance.find_or_create_subscription('test_key')).to eq(subscription)
61
61
  end
62
62
  end
@@ -70,14 +70,14 @@ shared_examples_for :subscriber do
70
70
 
71
71
  describe "#create_subscription" do
72
72
  before do
73
- expect(test_instance.subscriptions).to be_empty
73
+ expect(test_instance.subscriptions.to_a).to be_empty
74
74
  end
75
75
 
76
76
  context "without params" do
77
77
  it "does not create a new subscription since it is invalid" do
78
78
  new_subscription = test_instance.create_subscription
79
79
  expect(new_subscription).to be_nil
80
- expect(test_instance.subscriptions.reload).to be_empty
80
+ expect(test_instance.subscriptions.reload.to_a).to be_empty
81
81
  end
82
82
  end
83
83
 
@@ -85,8 +85,8 @@ shared_examples_for :subscriber do
85
85
  it "creates a new subscription" do
86
86
  params = { key: 'key_1' }
87
87
  new_subscription = test_instance.create_subscription(params)
88
- expect(new_subscription.subscribing?).to be_truthy
89
- expect(new_subscription.subscribing_to_email?).to be_truthy
88
+ expect(new_subscription.subscribing?).to be_truthy
89
+ expect(new_subscription.subscribing_to_email?).to be_truthy
90
90
  expect(test_instance.subscriptions.reload.size).to eq(1)
91
91
  end
92
92
  end
@@ -95,8 +95,8 @@ shared_examples_for :subscriber do
95
95
  it "creates a new subscription" do
96
96
  params = { key: 'key_1', subscribing: false }
97
97
  new_subscription = test_instance.create_subscription(params)
98
- expect(new_subscription.subscribing?).to be_falsey
99
- expect(new_subscription.subscribing_to_email?).to be_falsey
98
+ expect(new_subscription.subscribing?).to be_falsey
99
+ expect(new_subscription.subscribing_to_email?).to be_falsey
100
100
  expect(test_instance.subscriptions.reload.size).to eq(1)
101
101
  end
102
102
  end
@@ -105,8 +105,8 @@ shared_examples_for :subscriber do
105
105
  it "creates a new subscription" do
106
106
  params = { key: 'key_1', subscribing_to_email: false }
107
107
  new_subscription = test_instance.create_subscription(params)
108
- expect(new_subscription.subscribing?).to be_truthy
109
- expect(new_subscription.subscribing_to_email?).to be_falsey
108
+ expect(new_subscription.subscribing?).to be_truthy
109
+ expect(new_subscription.subscribing_to_email?).to be_falsey
110
110
  expect(test_instance.subscriptions.reload.size).to eq(1)
111
111
  end
112
112
  end
@@ -115,8 +115,8 @@ shared_examples_for :subscriber do
115
115
  it "creates a new subscription" do
116
116
  params = { key: 'key_1', subscribing: true, subscribing_to_email: false }
117
117
  new_subscription = test_instance.create_subscription(params)
118
- expect(new_subscription.subscribing?).to be_truthy
119
- expect(new_subscription.subscribing_to_email?).to be_falsey
118
+ expect(new_subscription.subscribing?).to be_truthy
119
+ expect(new_subscription.subscribing_to_email?).to be_falsey
120
120
  expect(test_instance.subscriptions.reload.size).to eq(1)
121
121
  end
122
122
  end
@@ -126,7 +126,7 @@ shared_examples_for :subscriber do
126
126
  params = { key: 'key_1', subscribing: false, subscribing_to_email: true }
127
127
  new_subscription = test_instance.create_subscription(params)
128
128
  expect(new_subscription).to be_nil
129
- expect(test_instance.subscriptions.reload).to be_empty
129
+ expect(test_instance.subscriptions.reload.to_a).to be_empty
130
130
  end
131
131
  end
132
132
 
@@ -167,7 +167,7 @@ shared_examples_for :subscriber do
167
167
  params = { key: 'key_1', subscribing: false, optional_targets: { subscribing_to_console_output: true } }
168
168
  new_subscription = test_instance.create_subscription(params)
169
169
  expect(new_subscription).to be_nil
170
- expect(test_instance.subscriptions.reload).to be_empty
170
+ expect(test_instance.subscriptions.reload.to_a).to be_empty
171
171
  end
172
172
  end
173
173
  end
@@ -187,8 +187,8 @@ shared_examples_for :subscriber do
187
187
 
188
188
  context "without any options" do
189
189
  it "returns the array of subscriptions" do
190
- expect(test_instance.subscription_index[0]).to eq(@subscription1)
191
- expect(test_instance.subscription_index[1]).to eq(@subscription2)
190
+ expect(test_instance.subscription_index[0]).to eq(@subscription1)
191
+ expect(test_instance.subscription_index[1]).to eq(@subscription2)
192
192
  expect(test_instance.subscription_index.size).to eq(2)
193
193
  end
194
194
  end
@@ -196,7 +196,7 @@ shared_examples_for :subscriber do
196
196
  context "with limit" do
197
197
  it "returns the same as subscriptions with limit" do
198
198
  options = { limit: 1 }
199
- expect(test_instance.subscription_index(options)[0]).to eq(@subscription1)
199
+ expect(test_instance.subscription_index(options)[0]).to eq(@subscription1)
200
200
  expect(test_instance.subscription_index(options).size).to eq(1)
201
201
  end
202
202
  end
@@ -204,8 +204,8 @@ shared_examples_for :subscriber do
204
204
  context "with reverse" do
205
205
  it "returns the earliest order" do
206
206
  options = { reverse: true }
207
- expect(test_instance.subscription_index(options)[0]).to eq(@subscription2)
208
- expect(test_instance.subscription_index(options)[1]).to eq(@subscription1)
207
+ expect(test_instance.subscription_index(options)[0]).to eq(@subscription2)
208
+ expect(test_instance.subscription_index(options)[1]).to eq(@subscription1)
209
209
  expect(test_instance.subscription_index(options).size).to eq(2)
210
210
  end
211
211
  end
@@ -213,37 +213,36 @@ shared_examples_for :subscriber do
213
213
  context 'with filtered_by_key options' do
214
214
  it "returns filtered notifications only" do
215
215
  options = { filtered_by_key: 'subscription_key_2' }
216
- expect(test_instance.subscription_index(options)[0]).to eq(@subscription2)
216
+ expect(test_instance.subscription_index(options)[0]).to eq(@subscription2)
217
217
  expect(test_instance.subscription_index(options).size).to eq(1)
218
218
  end
219
219
  end
220
220
 
221
221
  context 'with custom_filter options' do
222
- it "returns filtered notifications only" do
223
- if ActivityNotification.config.orm == :active_record
224
- options = { custom_filter: ["subscriptions.key = ?", 'subscription_key_2'] }
225
- expect(test_instance.subscription_index(options)[0]).to eq(@subscription2)
226
- expect(test_instance.subscription_index(options).size).to eq(1)
227
- end
228
-
222
+ it "returns filtered subscriptions only" do
229
223
  options = { custom_filter: { key: 'subscription_key_1' } }
230
- expect(test_instance.subscription_index(options)[0]).to eq(@subscription1)
224
+ expect(test_instance.subscription_index(options)[0]).to eq(@subscription1)
231
225
  expect(test_instance.subscription_index(options).size).to eq(1)
232
226
  end
233
- end
234
227
 
235
- #TODO
236
- # context 'with with_target options' do
237
- # it "calls includes(:target)" do
238
- # expect(ActiveRecord::Base).to receive(:includes).with(:target)
239
- # test_instance.subscription_index(with_target: true)
240
- # end
241
- # end
228
+ it "returns filtered subscriptions only with filter depending on ORM" do
229
+ options =
230
+ case ActivityNotification.config.orm
231
+ when :active_record then { custom_filter: ["subscriptions.key = ?", 'subscription_key_2'] }
232
+ when :mongoid then { custom_filter: { key: {'$eq': 'subscription_key_2'} } }
233
+ when :dynamoid then { custom_filter: {'key.begins_with': 'subscription_key_2'} }
234
+ end
235
+ expect(test_instance.subscription_index(options)[0]).to eq(@subscription2)
236
+ expect(test_instance.subscription_index(options).size).to eq(1)
237
+ end
238
+ end
242
239
 
243
- context 'without with_target options' do
244
- it "does not call includes(:target)" do
245
- expect(ActiveRecord::Base).not_to receive(:includes).with(:target)
246
- test_instance.subscription_index
240
+ if ActivityNotification.config.orm == :active_record
241
+ context 'with with_target options' do
242
+ it "calls with_target" do
243
+ expect(ActivityNotification::Subscription).to receive_message_chain(:with_target)
244
+ test_instance.subscription_index(with_target: true)
245
+ end
247
246
  end
248
247
  end
249
248
  end
@@ -322,16 +321,21 @@ shared_examples_for :subscriber do
322
321
 
323
322
  context 'with custom_filter options' do
324
323
  it "returns filtered notifications only" do
325
- if ActivityNotification.config.orm == :active_record
326
- options = { custom_filter: ["notifications.key = ?", 'notification_key_2'] }
327
- expect(test_instance.notification_keys(options)[0]).to eq('notification_key_2')
328
- expect(test_instance.notification_keys(options).size).to eq(1)
329
- end
330
-
331
324
  options = { custom_filter: { key: 'notification_key_1' } }
332
325
  expect(test_instance.notification_keys(options)[0]).to eq('notification_key_1')
333
326
  expect(test_instance.notification_keys(options).size).to eq(1)
334
327
  end
328
+
329
+ it "returns filtered notifications only with filter depending on ORM" do
330
+ options =
331
+ case ActivityNotification.config.orm
332
+ when :active_record then { custom_filter: ["notifications.key = ?", 'notification_key_2'] }
333
+ when :mongoid then { custom_filter: { key: {'$eq': 'notification_key_2'} } }
334
+ when :dynamoid then { custom_filter: {'key.begins_with': 'notification_key_2'} }
335
+ end
336
+ expect(test_instance.notification_keys(options)[0]).to eq('notification_key_2')
337
+ expect(test_instance.notification_keys(options).size).to eq(1)
338
+ end
335
339
  end
336
340
  end
337
341
  end