activity_notification 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +33 -0
  3. data/.rubocop.yml +1157 -0
  4. data/.yardopts +3 -0
  5. data/CHANGELOG.md +25 -0
  6. data/Gemfile.lock +15 -17
  7. data/README.md +154 -27
  8. data/activity_notification.gemspec +1 -1
  9. data/app/controllers/activity_notification/notifications_controller.rb +30 -104
  10. data/app/controllers/activity_notification/notifications_with_devise_controller.rb +1 -33
  11. data/app/controllers/activity_notification/subscriptions_controller.rb +184 -0
  12. data/app/controllers/activity_notification/subscriptions_with_devise_controller.rb +6 -0
  13. data/app/mailers/activity_notification/mailer.rb +3 -3
  14. data/app/views/activity_notification/notifications/default/_index.html.erb +3 -0
  15. data/app/views/activity_notification/notifications/default/index.html.erb +8 -10
  16. data/app/views/activity_notification/notifications/default/show.html.erb +24 -2
  17. data/app/views/activity_notification/subscriptions/default/_form.html.erb +52 -0
  18. data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +89 -0
  19. data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +73 -0
  20. data/app/views/activity_notification/subscriptions/default/_subscriptions.html.erb +13 -0
  21. data/app/views/activity_notification/subscriptions/default/create.js.erb +5 -0
  22. data/app/views/activity_notification/subscriptions/default/destroy.js.erb +5 -0
  23. data/app/views/activity_notification/subscriptions/default/index.html.erb +197 -0
  24. data/app/views/activity_notification/subscriptions/default/show.html.erb +177 -0
  25. data/app/views/activity_notification/subscriptions/default/subscribe.js.erb +8 -0
  26. data/app/views/activity_notification/subscriptions/default/subscribe_to_email.js.erb +6 -0
  27. data/app/views/activity_notification/subscriptions/default/unsubscribe.js.erb +8 -0
  28. data/app/views/activity_notification/subscriptions/default/unsubscribe_to_email.js.erb +6 -0
  29. data/gemfiles/Gemfile.rails-4.2.lock +18 -20
  30. data/gemfiles/Gemfile.rails-5.0.lock +18 -20
  31. data/lib/activity_notification.rb +7 -3
  32. data/lib/activity_notification/apis/notification_api.rb +95 -61
  33. data/lib/activity_notification/apis/subscription_api.rb +51 -0
  34. data/lib/activity_notification/common.rb +1 -1
  35. data/lib/activity_notification/config.rb +65 -17
  36. data/lib/activity_notification/controllers/common_controller.rb +118 -0
  37. data/lib/activity_notification/controllers/devise_authentication_controller.rb +41 -0
  38. data/lib/activity_notification/helpers/view_helpers.rb +131 -3
  39. data/lib/activity_notification/mailers/helpers.rb +6 -8
  40. data/lib/activity_notification/models/concerns/notifiable.rb +45 -27
  41. data/lib/activity_notification/models/concerns/subscriber.rb +149 -0
  42. data/lib/activity_notification/models/concerns/target.rb +100 -66
  43. data/lib/activity_notification/models/notification.rb +7 -5
  44. data/lib/activity_notification/models/subscription.rb +93 -0
  45. data/lib/activity_notification/rails/routes.rb +148 -33
  46. data/lib/activity_notification/renderable.rb +3 -4
  47. data/lib/activity_notification/roles/acts_as_notifiable.rb +14 -1
  48. data/lib/activity_notification/roles/acts_as_target.rb +11 -8
  49. data/lib/activity_notification/version.rb +1 -1
  50. data/lib/generators/activity_notification/controllers_generator.rb +2 -2
  51. data/lib/generators/activity_notification/install_generator.rb +0 -1
  52. data/lib/generators/activity_notification/migration/migration_generator.rb +8 -2
  53. data/lib/generators/activity_notification/models_generator.rb +53 -0
  54. data/lib/generators/activity_notification/views_generator.rb +7 -7
  55. data/lib/generators/templates/activity_notification.rb +17 -3
  56. data/lib/generators/templates/controllers/notifications_controller.rb +18 -17
  57. data/lib/generators/templates/controllers/notifications_with_devise_controller.rb +18 -17
  58. data/lib/generators/templates/controllers/subscriptions_controller.rb +79 -0
  59. data/lib/generators/templates/controllers/subscriptions_with_devise_controller.rb +87 -0
  60. data/lib/generators/templates/migrations/migration.rb +57 -0
  61. data/lib/generators/templates/models/README +10 -0
  62. data/lib/generators/templates/{notification → models}/notification.rb +1 -3
  63. data/lib/generators/templates/models/subscription.rb +4 -0
  64. data/spec/concerns/apis/notification_api_spec.rb +48 -11
  65. data/spec/concerns/apis/subscription_api_spec.rb +167 -0
  66. data/spec/concerns/models/notifiable_spec.rb +60 -0
  67. data/spec/concerns/models/subscriber_spec.rb +525 -0
  68. data/spec/concerns/models/target_spec.rb +271 -42
  69. data/spec/controllers/common_controller_spec.rb +25 -0
  70. data/spec/controllers/dummy_common_controller.rb +5 -0
  71. data/spec/controllers/notifications_controller_shared_examples.rb +2 -6
  72. data/spec/controllers/subscriptions_controller_shared_examples.rb +735 -0
  73. data/spec/controllers/subscriptions_controller_spec.rb +12 -0
  74. data/spec/controllers/subscriptions_with_devise_controller_spec.rb +91 -0
  75. data/spec/factories/dummy/dummy_subscriber.rb +4 -0
  76. data/spec/factories/subscriptions.rb +8 -0
  77. data/spec/generators/controllers_generator_spec.rb +25 -2
  78. data/spec/generators/migration/migration_generator_spec.rb +3 -3
  79. data/spec/generators/models_generator_spec.rb +96 -0
  80. data/spec/generators/views_generator_spec.rb +84 -0
  81. data/spec/helpers/view_helpers_spec.rb +143 -0
  82. data/spec/mailers/mailer_spec.rb +5 -4
  83. data/spec/models/dummy/dummy_subscriber_spec.rb +5 -0
  84. data/spec/models/notification_spec.rb +7 -7
  85. data/spec/models/subscription_spec.rb +158 -0
  86. data/spec/rails_app/app/controllers/users/notifications_controller.rb +67 -0
  87. data/spec/rails_app/app/controllers/users/notifications_with_devise_controller.rb +75 -0
  88. data/spec/rails_app/app/controllers/users/subscriptions_controller.rb +79 -0
  89. data/spec/rails_app/app/controllers/users/subscriptions_with_devise_controller.rb +87 -0
  90. data/spec/rails_app/app/models/admin.rb +1 -0
  91. data/spec/rails_app/app/models/dummy/dummy_subscriber.rb +4 -0
  92. data/spec/rails_app/app/models/user.rb +2 -1
  93. data/spec/rails_app/app/views/activity_notification/mailer/dummy_subscribers/test_key.text.erb +1 -0
  94. data/spec/rails_app/app/views/articles/index.html.erb +6 -0
  95. data/spec/rails_app/config/initializers/activity_notification.rb +17 -3
  96. data/spec/rails_app/config/routes.rb +2 -2
  97. data/spec/rails_app/db/migrate/20160715050420_create_activity_notification_tables.rb +33 -0
  98. data/spec/rails_app/db/schema.rb +18 -0
  99. data/spec/roles/acts_as_notifiable_spec.rb +1 -1
  100. data/spec/roles/acts_as_target_spec.rb +1 -1
  101. metadata +70 -11
  102. data/lib/generators/activity_notification/notification/notification_generator.rb +0 -20
  103. data/lib/generators/templates/active_record/migration.rb +0 -18
  104. data/spec/generators/notification/notification_generator_spec.rb +0 -41
  105. data/spec/rails_app/db/migrate/20160715050420_create_notifications.rb +0 -18
@@ -0,0 +1,57 @@
1
+ # Migration responsible for creating a table with notifications
2
+ class <%= @migration_name %> < ActiveRecord::Migration
3
+ # Create tables
4
+ def change
5
+ <% if @migration_tables.include?('notifications') %>create_table :notifications do |t|
6
+ t.belongs_to :target, polymorphic: true, index: true, null: false
7
+ t.belongs_to :notifiable, polymorphic: true, index: true, null: false
8
+ t.string :key, null: false
9
+ t.belongs_to :group, polymorphic: true, index: true
10
+ t.integer :group_owner_id, index: true
11
+ t.belongs_to :notifier, polymorphic: true, index: true
12
+ t.text :parameters
13
+ t.datetime :opened_at
14
+
15
+ t.timestamps
16
+ end<% else %># create_table :notifications do |t|
17
+ # t.belongs_to :target, polymorphic: true, index: true, null: false
18
+ # t.belongs_to :notifiable, polymorphic: true, index: true, null: false
19
+ # t.string :key, null: false
20
+ # t.belongs_to :group, polymorphic: true, index: true
21
+ # t.integer :group_owner_id, index: true
22
+ # t.belongs_to :notifier, polymorphic: true, index: true
23
+ # t.text :parameters
24
+ # t.datetime :opened_at
25
+ #
26
+ # t.timestamps
27
+ # end<% end %>
28
+
29
+ <% if @migration_tables.include?('subscriptions') %>create_table :subscriptions do |t|
30
+ t.belongs_to :target, polymorphic: true, index: true, null: false
31
+ t.string :key, index: true, null: false
32
+ t.boolean :subscribing, null: false, default: true
33
+ t.boolean :subscribing_to_email, null: false, default: true
34
+ t.datetime :subscribed_at
35
+ t.datetime :unsubscribed_at
36
+ t.datetime :subscribed_to_email_at
37
+ t.datetime :unsubscribed_to_email_at
38
+ t.text :parameters
39
+
40
+ t.timestamps
41
+ end
42
+ add_index :subscriptions, [:target_type, :target_id, :key], unique: true<% else %># create_table :subscriptions do |t|
43
+ # t.belongs_to :target, polymorphic: true, index: true, null: false
44
+ # t.string :key, index: true, null: false
45
+ # t.boolean :subscribing, null: false, default: true
46
+ # t.boolean :subscribing_to_email, null: false, default: true
47
+ # t.datetime :subscribed_at
48
+ # t.datetime :unsubscribed_at
49
+ # t.datetime :subscribed_to_email_at
50
+ # t.datetime :unsubscribed_to_email_at
51
+ # t.text :parameters
52
+ #
53
+ # t.timestamps
54
+ # end
55
+ # add_index :subscriptions, [:target_type, :target_id, :key], unique: true<% end %>
56
+ end
57
+ end
@@ -0,0 +1,10 @@
1
+ ===============================================================================
2
+
3
+ Some setup you must do manually if you haven't yet:
4
+
5
+ Ensure you have configured model name in your initializer activity_notification.rb.
6
+ For example:
7
+
8
+ #TODO
9
+
10
+ ===============================================================================
@@ -1,6 +1,4 @@
1
1
  # Notification model for customisation & custom methods
2
- class <%= @model_name %> < ActivityNotification::Notification
3
-
2
+ class <%= @target_prefix %><%= @model_name %> < ActivityNotification::Notification
4
3
  # Write custom methods or override methods here
5
-
6
4
  end
@@ -0,0 +1,4 @@
1
+ # Subscription model for customisation & custom methods
2
+ class <%= @target_prefix %><%= @model_name %> < ActivityNotification::Subscription
3
+ # Write custom methods or override methods here
4
+ end
@@ -118,7 +118,7 @@ shared_examples_for :notification_api do
118
118
  end
119
119
 
120
120
  describe ".notify_to" do
121
- it "returns reated notification" do
121
+ it "returns created notification" do
122
122
  notification = described_class.notify_to(@user_1, @comment_2)
123
123
  validate_expected_notification(notification, @user_1, @comment_2)
124
124
  end
@@ -299,6 +299,29 @@ shared_examples_for :notification_api do
299
299
  member_notification = described_class.notify_to(@user_1, @comment_2, key: 'key2', group: @article)
300
300
  expect(member_notification.group_owner).to eq(nil)
301
301
  end
302
+
303
+ context "with group_expiry_delay option" do
304
+ context "within the group expiry period" do
305
+ it "belongs to single group" do
306
+ owner_notification = described_class.notify_to(@user_1, @comment_1, group: @article, group_expiry_delay: 1.day)
307
+ member_notification_1 = described_class.notify_to(@user_1, @comment_2, group: @article, group_expiry_delay: 1.day)
308
+ member_notification_2 = described_class.notify_to(@user_1, @comment_2, group: @article, group_expiry_delay: 1.day)
309
+ expect(member_notification_1.group_owner).to eq(owner_notification)
310
+ expect(member_notification_2.group_owner).to eq(owner_notification)
311
+ end
312
+ end
313
+
314
+ context "out of the group expiry period" do
315
+ it "does not belong to single group" do
316
+ owner_notification = described_class.notify_to(@user_1, @comment_1, group: @article, group_expiry_delay: 1.second)
317
+ member_notification_1 = described_class.notify_to(@user_1, @comment_2, group: @article, group_expiry_delay: 1.second)
318
+ sleep(1)
319
+ member_notification_2 = described_class.notify_to(@user_1, @comment_2, group: @article, group_expiry_delay: 1.second)
320
+ expect(member_notification_1.group_owner).to eq(owner_notification)
321
+ expect(member_notification_2.group_owner).to be_nil
322
+ end
323
+ end
324
+ end
302
325
  end
303
326
  end
304
327
 
@@ -328,16 +351,16 @@ shared_examples_for :notification_api do
328
351
 
329
352
  it "opens all notification with current time" do
330
353
  expect(@user_1.notifications.first.opened_at).to be_nil
331
- Timecop.freeze(DateTime.now)
354
+ Timecop.freeze(Time.current)
332
355
  described_class.open_all_of(@user_1)
333
- expect(@user_1.notifications.first.opened_at.to_i).to eq(DateTime.now.to_i)
356
+ expect(@user_1.notifications.first.opened_at.to_i).to eq(Time.current.to_i)
334
357
  Timecop.return
335
358
  end
336
359
 
337
360
  context "with opened_at option" do
338
361
  it "opens all notification with specified time" do
339
362
  expect(@user_1.notifications.first.opened_at).to be_nil
340
- opened_at = DateTime.now - 1.months
363
+ opened_at = Time.current - 1.months
341
364
  described_class.open_all_of(@user_1, opened_at: opened_at)
342
365
  expect(@user_1.notifications.first.opened_at.to_i).to eq(opened_at.to_i)
343
366
  end
@@ -507,21 +530,21 @@ shared_examples_for :notification_api do
507
530
  context "as default" do
508
531
  it "open notification with current time" do
509
532
  expect(test_instance.opened_at.blank?).to be_truthy
510
- Timecop.freeze(DateTime.now)
533
+ Timecop.freeze(Time.current)
511
534
  test_instance.open!
512
535
  expect(test_instance.opened_at.blank?).to be_falsey
513
- expect(test_instance.opened_at).to eq(DateTime.now)
536
+ expect(test_instance.opened_at).to eq(Time.current)
514
537
  Timecop.return
515
538
  end
516
539
 
517
540
  it "open group member notifications with current time" do
518
541
  group_member = create(test_class_name, group_owner: test_instance)
519
542
  expect(group_member.opened_at.blank?).to be_truthy
520
- Timecop.freeze(DateTime.now)
543
+ Timecop.freeze(Time.current)
521
544
  test_instance.open!
522
545
  group_member = group_member.reload
523
546
  expect(group_member.opened_at.blank?).to be_falsey
524
- expect(group_member.opened_at.to_i).to eq(DateTime.now.to_i)
547
+ expect(group_member.opened_at.to_i).to eq(Time.current.to_i)
525
548
  Timecop.return
526
549
  end
527
550
  end
@@ -529,7 +552,7 @@ shared_examples_for :notification_api do
529
552
  context "with opened_at option" do
530
553
  it "open notification with specified time" do
531
554
  expect(test_instance.opened_at.blank?).to be_truthy
532
- opened_at = DateTime.now - 1.months
555
+ opened_at = Time.current - 1.months
533
556
  test_instance.open!(opened_at: opened_at)
534
557
  expect(test_instance.opened_at.blank?).to be_falsey
535
558
  expect(test_instance.opened_at).to eq(opened_at)
@@ -538,7 +561,7 @@ shared_examples_for :notification_api do
538
561
  it "open group member notifications with specified time" do
539
562
  group_member = create(test_class_name, group_owner: test_instance)
540
563
  expect(group_member.opened_at.blank?).to be_truthy
541
- opened_at = DateTime.now - 1.months
564
+ opened_at = Time.current - 1.months
542
565
  test_instance.open!(opened_at: opened_at)
543
566
  group_member = group_member.reload
544
567
  expect(group_member.opened_at.blank?).to be_falsey
@@ -550,7 +573,7 @@ shared_examples_for :notification_api do
550
573
  it "does not open group member notifications" do
551
574
  group_member = create(test_class_name, group_owner: test_instance)
552
575
  expect(group_member.opened_at.blank?).to be_truthy
553
- opened_at = DateTime.now - 1.months
576
+ opened_at = Time.current - 1.months
554
577
  test_instance.open!(with_members: false)
555
578
  group_member = group_member.reload
556
579
  expect(group_member.opened_at.blank?).to be_truthy
@@ -1087,6 +1110,20 @@ shared_examples_for :notification_api do
1087
1110
  .to eq(test_instance.notifiable.notifiable_path(test_instance.target_type, test_instance.key))
1088
1111
  end
1089
1112
  end
1113
+
1114
+ describe "#subscribed?" do
1115
+ it "returns target.subscribes_to_notification?" do
1116
+ expect(test_instance.subscribed?)
1117
+ .to eq(test_instance.target.subscribes_to_notification?(test_instance.key))
1118
+ end
1119
+ end
1120
+
1121
+ describe "#email_subscribed?" do
1122
+ it "returns target.subscribes_to_notification_email?" do
1123
+ expect(test_instance.subscribed?)
1124
+ .to eq(test_instance.target.subscribes_to_notification_email?(test_instance.key))
1125
+ end
1126
+ end
1090
1127
  end
1091
1128
 
1092
1129
  describe "as protected instance methods" do
@@ -0,0 +1,167 @@
1
+ shared_examples_for :subscription_api do
2
+ include ActiveJob::TestHelper
3
+ let(:test_class_name) { described_class.to_s.underscore.split('/').last.to_sym }
4
+ let(:test_instance) { create(test_class_name) }
5
+
6
+ describe "as public instance methods" do
7
+ describe "#subscribe" do
8
+ before do
9
+ test_instance.unsubscribe
10
+ end
11
+
12
+ it "returns if successfully updated subscription instance" do
13
+ expect(test_instance.subscribe).to be_truthy
14
+ end
15
+
16
+ context "as default" do
17
+ it "subscribe with current time" do
18
+ expect(test_instance.subscribing).to eq(false)
19
+ expect(test_instance.subscribing_to_email).to eq(false)
20
+ Timecop.freeze(Time.current)
21
+ test_instance.subscribe
22
+ expect(test_instance.subscribing).to eq(true)
23
+ expect(test_instance.subscribing_to_email).to eq(true)
24
+ expect(test_instance.subscribed_at).to eq(Time.current)
25
+ expect(test_instance.subscribed_to_email_at).to eq(Time.current)
26
+ Timecop.return
27
+ end
28
+ end
29
+
30
+ context "with subscribed_at option" do
31
+ it "subscribe with specified time" do
32
+ expect(test_instance.subscribing).to eq(false)
33
+ expect(test_instance.subscribing_to_email).to eq(false)
34
+ subscribed_at = Time.current - 1.months
35
+ test_instance.subscribe(subscribed_at: subscribed_at)
36
+ expect(test_instance.subscribing).to eq(true)
37
+ expect(test_instance.subscribing_to_email).to eq(true)
38
+ expect(test_instance.subscribed_at).to eq(subscribed_at)
39
+ expect(test_instance.subscribed_to_email_at).to eq(subscribed_at)
40
+ end
41
+ end
42
+
43
+ context "with false as with_email_subscription" do
44
+ it "does not subscribe to email" do
45
+ expect(test_instance.subscribing).to eq(false)
46
+ expect(test_instance.subscribing_to_email).to eq(false)
47
+ test_instance.subscribe(with_email_subscription: false)
48
+ expect(test_instance.subscribing).to eq(true)
49
+ expect(test_instance.subscribing_to_email).to eq(false)
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "#unsubscribe" do
55
+ it "returns if successfully updated subscription instance" do
56
+ expect(test_instance.subscribe).to be_truthy
57
+ end
58
+
59
+ context "as default" do
60
+ it "unsubscribe with current time" do
61
+ expect(test_instance.subscribing).to eq(true)
62
+ expect(test_instance.subscribing_to_email).to eq(true)
63
+ Timecop.freeze(Time.current)
64
+ test_instance.unsubscribe
65
+ expect(test_instance.subscribing).to eq(false)
66
+ expect(test_instance.subscribing_to_email).to eq(false)
67
+ expect(test_instance.unsubscribed_at).to eq(Time.current)
68
+ expect(test_instance.unsubscribed_to_email_at).to eq(Time.current)
69
+ Timecop.return
70
+ end
71
+ end
72
+
73
+ context "with unsubscribed_at option" do
74
+ it "unsubscribe with specified time" do
75
+ expect(test_instance.subscribing).to eq(true)
76
+ expect(test_instance.subscribing_to_email).to eq(true)
77
+ unsubscribed_at = Time.current - 1.months
78
+ test_instance.unsubscribe(unsubscribed_at: unsubscribed_at)
79
+ expect(test_instance.subscribing).to eq(false)
80
+ expect(test_instance.subscribing_to_email).to eq(false)
81
+ expect(test_instance.unsubscribed_at).to eq(unsubscribed_at)
82
+ expect(test_instance.unsubscribed_to_email_at).to eq(unsubscribed_at)
83
+ end
84
+ end
85
+ end
86
+
87
+ describe "#subscribe_to_email" do
88
+ before do
89
+ test_instance.unsubscribe_to_email
90
+ end
91
+
92
+ context "for subscribing instance" do
93
+ it "returns true as successfully updated subscription instance" do
94
+ expect(test_instance.subscribing).to eq(true)
95
+ expect(test_instance.subscribing_to_email).to eq(false)
96
+ expect(test_instance.subscribe_to_email).to be_truthy
97
+ end
98
+ end
99
+
100
+ context "for not subscribing instance" do
101
+ it "returns false as successfully updated subscription instance" do
102
+ test_instance.unsubscribe
103
+ expect(test_instance.subscribing).to eq(false)
104
+ expect(test_instance.subscribing_to_email).to eq(false)
105
+ expect(test_instance.subscribe_to_email).to be_falsey
106
+ end
107
+ end
108
+
109
+ context "as default" do
110
+ it "subscribe_to_email with current time" do
111
+ expect(test_instance.subscribing).to eq(true)
112
+ expect(test_instance.subscribing_to_email).to eq(false)
113
+ Timecop.freeze(Time.current)
114
+ test_instance.subscribe_to_email
115
+ expect(test_instance.subscribing).to eq(true)
116
+ expect(test_instance.subscribing_to_email).to eq(true)
117
+ expect(test_instance.subscribed_to_email_at).to eq(Time.current)
118
+ Timecop.return
119
+ end
120
+ end
121
+
122
+ context "with subscribed_to_email_at option" do
123
+ it "subscribe with specified time" do
124
+ expect(test_instance.subscribing).to eq(true)
125
+ expect(test_instance.subscribing_to_email).to eq(false)
126
+ subscribed_to_email_at = Time.current - 1.months
127
+ test_instance.subscribe_to_email(subscribed_to_email_at: subscribed_to_email_at)
128
+ expect(test_instance.subscribing).to eq(true)
129
+ expect(test_instance.subscribing_to_email).to eq(true)
130
+ expect(test_instance.subscribed_to_email_at).to eq(subscribed_to_email_at)
131
+ end
132
+ end
133
+ end
134
+
135
+ describe "#unsubscribe_to_email" do
136
+ it "returns if successfully updated subscription instance" do
137
+ expect(test_instance.unsubscribe_to_email).to be_truthy
138
+ end
139
+
140
+ context "as default" do
141
+ it "unsubscribe_to_email with current time" do
142
+ expect(test_instance.subscribing).to eq(true)
143
+ expect(test_instance.subscribing_to_email).to eq(true)
144
+ Timecop.freeze(Time.current)
145
+ test_instance.unsubscribe_to_email
146
+ expect(test_instance.subscribing).to eq(true)
147
+ expect(test_instance.subscribing_to_email).to eq(false)
148
+ expect(test_instance.unsubscribed_to_email_at).to eq(Time.current)
149
+ Timecop.return
150
+ end
151
+ end
152
+
153
+ context "with unsubscribed_to_email_at option" do
154
+ it "unsubscribe with specified time" do
155
+ expect(test_instance.subscribing).to eq(true)
156
+ expect(test_instance.subscribing_to_email).to eq(true)
157
+ unsubscribed_to_email_at = Time.current - 1.months
158
+ test_instance.unsubscribe_to_email(unsubscribed_to_email_at: unsubscribed_to_email_at)
159
+ expect(test_instance.subscribing).to eq(true)
160
+ expect(test_instance.subscribing_to_email).to eq(false)
161
+ expect(test_instance.unsubscribed_to_email_at).to eq(unsubscribed_to_email_at)
162
+ end
163
+ end
164
+ end
165
+
166
+ end
167
+ end
@@ -17,6 +17,7 @@ shared_examples_for :notifiable do
17
17
  described_class.set_notifiable_class_defaults
18
18
  expect(described_class._notification_targets).to eq({})
19
19
  expect(described_class._notification_group).to eq({})
20
+ expect(described_class._notification_group_expiry_delay).to eq({})
20
21
  expect(described_class._notifier).to eq({})
21
22
  expect(described_class._notification_parameters).to eq({})
22
23
  expect(described_class._notification_email_allowed).to eq({})
@@ -155,6 +156,65 @@ shared_examples_for :notifiable do
155
156
  end
156
157
  end
157
158
 
159
+ describe "#notification_group_expiry_delay" do
160
+ context "without any configuration" do
161
+ it "returns nil" do
162
+ expect(test_instance.notification_group_expiry_delay(User, 'dummy_key')).to be_nil
163
+ end
164
+ end
165
+
166
+ context "configured with overriden method" do
167
+ it "returns specified value" do
168
+ module AdditionalMethods
169
+ def notification_group_expiry_delay_for_users(key)
170
+ User.all.first
171
+ end
172
+ end
173
+ test_instance.extend(AdditionalMethods)
174
+ expect(test_instance.notification_group_expiry_delay(User, 'dummy_key')).to eq(User.all.first)
175
+ end
176
+ end
177
+
178
+ context "configured with a field" do
179
+ it "returns specified value" do
180
+ described_class._notification_group_expiry_delay[:users] = User.all.first
181
+ expect(test_instance.notification_group_expiry_delay(User, 'dummy_key')).to eq(User.all.first)
182
+ end
183
+
184
+ it "returns specified symbol without argumentss" do
185
+ module AdditionalMethods
186
+ def custom_notification_group_expiry_delay
187
+ User.all.first
188
+ end
189
+ end
190
+ test_instance.extend(AdditionalMethods)
191
+ described_class._notification_group_expiry_delay[:users] = :custom_notification_group_expiry_delay
192
+ expect(test_instance.notification_group_expiry_delay(User, 'dummy_key')).to eq(User.all.first)
193
+ end
194
+
195
+ it "returns specified symbol with key argument" do
196
+ module AdditionalMethods
197
+ def custom_notification_group_expiry_delay(key)
198
+ User.all.first
199
+ end
200
+ end
201
+ test_instance.extend(AdditionalMethods)
202
+ described_class._notification_group_expiry_delay[:users] = :custom_notification_group_expiry_delay
203
+ expect(test_instance.notification_group_expiry_delay(User, 'dummy_key')).to eq(User.all.first)
204
+ end
205
+
206
+ it "returns specified lambda with single notifiable argument" do
207
+ described_class._notification_group_expiry_delay[:users] = ->(notifiable){ User.all.first }
208
+ expect(test_instance.notification_group_expiry_delay(User, 'dummy_key')).to eq(User.all.first)
209
+ end
210
+
211
+ it "returns specified lambda with notifiable and key arguments" do
212
+ described_class._notification_group_expiry_delay[:users] = ->(notifiable, key){ User.all.first }
213
+ expect(test_instance.notification_group_expiry_delay(User, 'dummy_key')).to eq(User.all.first)
214
+ end
215
+ end
216
+ end
217
+
158
218
  describe "#notification_parameters" do
159
219
  context "without any configuration" do
160
220
  it "returns blank hash" do