activity_notification 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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