activity_notification 1.1.0 → 1.2.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +1 -1
  4. data/CHANGELOG.md +23 -11
  5. data/Gemfile.lock +52 -40
  6. data/README.md +177 -14
  7. data/activity_notification.gemspec +3 -1
  8. data/app/controllers/activity_notification/subscriptions_controller.rb +48 -2
  9. data/app/views/activity_notification/optional_targets/default/base/_default.text.erb +10 -0
  10. data/app/views/activity_notification/optional_targets/default/slack/_default.text.erb +6 -0
  11. data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +19 -0
  12. data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +32 -3
  13. data/app/views/activity_notification/subscriptions/default/index.html.erb +4 -0
  14. data/app/views/activity_notification/subscriptions/default/show.html.erb +5 -0
  15. data/app/views/activity_notification/subscriptions/default/subscribe_to_optional_target.js.erb +6 -0
  16. data/app/views/activity_notification/subscriptions/default/unsubscribe_to_optional_target.js.erb +6 -0
  17. data/gemfiles/Gemfile.rails-4.2.lock +15 -3
  18. data/gemfiles/Gemfile.rails-5.0.lock +47 -35
  19. data/lib/activity_notification.rb +1 -0
  20. data/lib/activity_notification/apis/notification_api.rb +83 -26
  21. data/lib/activity_notification/apis/subscription_api.rb +93 -8
  22. data/lib/activity_notification/common.rb +6 -2
  23. data/lib/activity_notification/helpers/view_helpers.rb +43 -0
  24. data/lib/activity_notification/models/concerns/notifiable.rb +73 -28
  25. data/lib/activity_notification/models/concerns/subscriber.rb +34 -7
  26. data/lib/activity_notification/models/concerns/target.rb +25 -13
  27. data/lib/activity_notification/models/subscription.rb +13 -2
  28. data/lib/activity_notification/optional_targets/amazon_sns.rb +42 -0
  29. data/lib/activity_notification/optional_targets/base.rb +79 -0
  30. data/lib/activity_notification/optional_targets/slack.rb +33 -0
  31. data/lib/activity_notification/rails/routes.rb +30 -20
  32. data/lib/activity_notification/roles/acts_as_notifiable.rb +70 -11
  33. data/lib/activity_notification/version.rb +1 -1
  34. data/lib/generators/activity_notification/views_generator.rb +2 -2
  35. data/lib/generators/templates/migrations/migration.rb +2 -2
  36. data/spec/concerns/apis/notification_api_spec.rb +97 -0
  37. data/spec/concerns/apis/subscription_api_spec.rb +206 -41
  38. data/spec/concerns/common_spec.rb +7 -2
  39. data/spec/concerns/models/notifiable_spec.rb +88 -2
  40. data/spec/concerns/models/subscriber_spec.rb +114 -13
  41. data/spec/concerns/models/target_spec.rb +17 -0
  42. data/spec/controllers/subscriptions_controller_shared_examples.rb +251 -28
  43. data/spec/helpers/view_helpers_spec.rb +56 -0
  44. data/spec/optional_targets/amazon_sns_spec.rb +46 -0
  45. data/spec/optional_targets/base_spec.rb +43 -0
  46. data/spec/optional_targets/slack_spec.rb +46 -0
  47. data/spec/rails_app/app/controllers/comments_controller.rb +1 -0
  48. data/spec/rails_app/app/models/admin.rb +1 -2
  49. data/spec/rails_app/app/models/article.rb +2 -3
  50. data/spec/rails_app/app/models/comment.rb +19 -7
  51. data/spec/rails_app/app/views/activity_notification/optional_targets/admins/amazon_sns/comment/_default.text.erb +8 -0
  52. data/spec/rails_app/db/migrate/20160715050420_create_activity_notification_tables.rb +1 -1
  53. data/spec/rails_app/db/migrate/20160715050433_create_test_tables.rb +2 -0
  54. data/spec/rails_app/db/schema.rb +3 -1
  55. data/spec/rails_app/db/seeds.rb +1 -1
  56. data/spec/rails_app/lib/custom_optional_targets/console_output.rb +13 -0
  57. data/spec/rails_app/lib/custom_optional_targets/wrong_target.rb +10 -0
  58. data/spec/roles/acts_as_notifiable_spec.rb +124 -2
  59. metadata +49 -4
  60. data/spec/rails_app/app/models/notification.rb +0 -6
@@ -1,3 +1,3 @@
1
1
  module ActivityNotification
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -14,7 +14,7 @@ module ActivityNotification
14
14
  # @example Run view generator to create only notification email views
15
15
  # rails generate activity_notification:views -v mailer
16
16
  class ViewsGenerator < Rails::Generators::Base
17
- VIEWS = [:notifications, :mailer, :subscriptions].freeze
17
+ VIEWS = [:notifications, :mailer, :subscriptions, :optional_targets].freeze
18
18
 
19
19
  source_root File.expand_path("../../../../app/views/activity_notification", __FILE__)
20
20
  desc "Copies default ActivityNotification views to your application."
@@ -22,7 +22,7 @@ module ActivityNotification
22
22
  argument :target, required: false, default: nil,
23
23
  desc: "The target to copy views to"
24
24
  class_option :views, aliases: "-v", type: :array,
25
- desc: "Select specific view directories to generate (notifications, mailer, subscriptions)"
25
+ desc: "Select specific view directories to generate (notifications, mailer, subscriptions, optional_targets)"
26
26
  public_task :copy_views
27
27
 
28
28
  # Copies view files in application directory
@@ -35,7 +35,7 @@ class <%= @migration_name %> < ActiveRecord::Migration
35
35
  t.datetime :unsubscribed_at
36
36
  t.datetime :subscribed_to_email_at
37
37
  t.datetime :unsubscribed_to_email_at
38
- t.text :parameters
38
+ t.text :optional_targets
39
39
 
40
40
  t.timestamps
41
41
  end
@@ -48,7 +48,7 @@ class <%= @migration_name %> < ActiveRecord::Migration
48
48
  # t.datetime :unsubscribed_at
49
49
  # t.datetime :subscribed_to_email_at
50
50
  # t.datetime :unsubscribed_to_email_at
51
- # t.text :parameters
51
+ # t.text :optional_targets
52
52
  #
53
53
  # t.timestamps
54
54
  # end
@@ -2,6 +2,7 @@ shared_examples_for :notification_api do
2
2
  include ActiveJob::TestHelper
3
3
  let(:test_class_name) { described_class.to_s.underscore.split('/').last.to_sym }
4
4
  let(:test_instance) { create(test_class_name) }
5
+ let(:notifiable_class) { test_instance.notifiable.class }
5
6
  before do
6
7
  ActiveJob::Base.queue_adapter = :test
7
8
  ActivityNotification::Mailer.deliveries.clear
@@ -513,6 +514,47 @@ shared_examples_for :notification_api do
513
514
  end
514
515
  end
515
516
 
517
+ describe "#publish_to_optional_targets" do
518
+ before do
519
+ require 'custom_optional_targets/console_output'
520
+ @optional_target = CustomOptionalTarget::ConsoleOutput.new
521
+ notifiable_class.acts_as_notifiable test_instance.target.to_resources_name.to_sym, optional_targets: ->{ [@optional_target] }
522
+ expect(test_instance.notifiable.optional_targets(test_instance.target.to_resources_name, test_instance.key)).to eq([@optional_target])
523
+ end
524
+
525
+ context "subscribed by target" do
526
+ before do
527
+ test_instance.target.create_subscription(key: test_instance.key, optional_targets: { subscribing_to_console_output: true })
528
+ expect(test_instance.optional_target_subscribed?(:console_output)).to be_truthy
529
+ end
530
+
531
+ it "calls OptionalTarget#notify" do
532
+ expect(@optional_target).to receive(:notify)
533
+ test_instance.publish_to_optional_targets
534
+ end
535
+
536
+ it "returns truthy result hash" do
537
+ expect(test_instance.publish_to_optional_targets).to eq({ console_output: true })
538
+ end
539
+ end
540
+
541
+ context "unsubscribed by target" do
542
+ before do
543
+ test_instance.target.create_subscription(key: test_instance.key, optional_targets: { subscribing_to_console_output: false })
544
+ expect(test_instance.optional_target_subscribed?(:console_output)).to be_falsey
545
+ end
546
+
547
+ it "does not call OptionalTarget#notify" do
548
+ expect(@optional_target).not_to receive(:notify)
549
+ test_instance.publish_to_optional_targets
550
+ end
551
+
552
+ it "returns truthy result hash" do
553
+ expect(test_instance.publish_to_optional_targets).to eq({ console_output: false })
554
+ end
555
+ end
556
+ end
557
+
516
558
  describe "#open!" do
517
559
  before do
518
560
  described_class.delete_all
@@ -1104,6 +1146,30 @@ shared_examples_for :notification_api do
1104
1146
  end
1105
1147
  end
1106
1148
 
1149
+ describe "#remove_from_group" do
1150
+ before do
1151
+ @member1 = create(test_class_name, target: test_instance.target, group_owner: test_instance)
1152
+ @member2 = create(test_class_name, target: test_instance.target, group_owner: test_instance)
1153
+ expect(test_instance.group_member_count).to eq(2)
1154
+ expect(@member1.group_owner?).to be_falsey
1155
+ end
1156
+
1157
+ it "removes from notification group" do
1158
+ test_instance.remove_from_group
1159
+ expect(test_instance.group_member_count).to eq(0)
1160
+ end
1161
+
1162
+ it "makes a new group owner" do
1163
+ test_instance.remove_from_group
1164
+ expect(@member1.reload.group_owner?).to be_truthy
1165
+ expect(@member1.group_members).to eq([@member2])
1166
+ end
1167
+
1168
+ it "returns new group owner instance" do
1169
+ expect(test_instance.remove_from_group).to eq(@member1)
1170
+ end
1171
+ end
1172
+
1107
1173
  describe "#notifiable_path" do
1108
1174
  it "returns notifiable.notifiable_path" do
1109
1175
  expect(test_instance.notifiable_path)
@@ -1124,6 +1190,37 @@ shared_examples_for :notification_api do
1124
1190
  .to eq(test_instance.target.subscribes_to_notification_email?(test_instance.key))
1125
1191
  end
1126
1192
  end
1193
+
1194
+ describe "#optional_target_subscribed?" do
1195
+ it "returns target.subscribes_to_optional_target?" do
1196
+ test_instance.target.create_subscription(key: test_instance.key, optional_targets: { subscribing_to_console_output: false })
1197
+ expect(test_instance.optional_target_subscribed?(:console_output)).to be_falsey
1198
+ expect(test_instance.optional_target_subscribed?(:console_output))
1199
+ .to eq(test_instance.target.subscribes_to_optional_target?(test_instance.key, :console_output))
1200
+ end
1201
+ end
1202
+
1203
+ describe "#optional_targets" do
1204
+ it "returns notifiable.optional_targets" do
1205
+ require 'custom_optional_targets/console_output'
1206
+ @optional_target = CustomOptionalTarget::ConsoleOutput.new
1207
+ notifiable_class.acts_as_notifiable test_instance.target.to_resources_name.to_sym, optional_targets: ->{ [@optional_target] }
1208
+ expect(test_instance.optional_targets).to eq([@optional_target])
1209
+ expect(test_instance.optional_targets)
1210
+ .to eq(test_instance.notifiable.optional_targets(test_instance.target.to_resources_name, test_instance.key))
1211
+ end
1212
+ end
1213
+
1214
+ describe "#optional_target_names" do
1215
+ it "returns notifiable.optional_target_names" do
1216
+ require 'custom_optional_targets/console_output'
1217
+ @optional_target = CustomOptionalTarget::ConsoleOutput.new
1218
+ notifiable_class.acts_as_notifiable test_instance.target.to_resources_name.to_sym, optional_targets: ->{ [@optional_target] }
1219
+ expect(test_instance.optional_target_names).to eq([:console_output])
1220
+ expect(test_instance.optional_target_names)
1221
+ .to eq(test_instance.notifiable.optional_target_names(test_instance.target.to_resources_name, test_instance.key))
1222
+ end
1223
+ end
1127
1224
  end
1128
1225
 
1129
1226
  describe "as protected instance methods" do
@@ -3,6 +3,26 @@ shared_examples_for :subscription_api do
3
3
  let(:test_class_name) { described_class.to_s.underscore.split('/').last.to_sym }
4
4
  let(:test_instance) { create(test_class_name) }
5
5
 
6
+ describe "as public class methods" do
7
+ describe ".to_optional_target_key" do
8
+ it "returns optional target key" do
9
+ expect(described_class.to_optional_target_key(:console_output)).to eq(:subscribing_to_console_output)
10
+ end
11
+ end
12
+
13
+ describe ".to_optional_target_subscribed_at_key" do
14
+ it "returns optional target subscribed_at key" do
15
+ expect(described_class.to_optional_target_subscribed_at_key(:console_output)).to eq(:subscribed_to_console_output_at)
16
+ end
17
+ end
18
+
19
+ describe ".to_optional_target_unsubscribed_at_key" do
20
+ it "returns optional target unsubscribed_at key" do
21
+ expect(described_class.to_optional_target_unsubscribed_at_key(:console_output)).to eq(:unsubscribed_to_console_output_at)
22
+ end
23
+ end
24
+ end
25
+
6
26
  describe "as public instance methods" do
7
27
  describe "#subscribe" do
8
28
  before do
@@ -15,12 +35,12 @@ shared_examples_for :subscription_api do
15
35
 
16
36
  context "as default" do
17
37
  it "subscribe with current time" do
18
- expect(test_instance.subscribing).to eq(false)
19
- expect(test_instance.subscribing_to_email).to eq(false)
38
+ expect(test_instance.subscribing?).to eq(false)
39
+ expect(test_instance.subscribing_to_email?).to eq(false)
20
40
  Timecop.freeze(Time.current)
21
41
  test_instance.subscribe
22
- expect(test_instance.subscribing).to eq(true)
23
- expect(test_instance.subscribing_to_email).to eq(true)
42
+ expect(test_instance.subscribing?).to eq(true)
43
+ expect(test_instance.subscribing_to_email?).to eq(true)
24
44
  expect(test_instance.subscribed_at).to eq(Time.current)
25
45
  expect(test_instance.subscribed_to_email_at).to eq(Time.current)
26
46
  Timecop.return
@@ -29,12 +49,12 @@ shared_examples_for :subscription_api do
29
49
 
30
50
  context "with subscribed_at option" do
31
51
  it "subscribe with specified time" do
32
- expect(test_instance.subscribing).to eq(false)
33
- expect(test_instance.subscribing_to_email).to eq(false)
52
+ expect(test_instance.subscribing?).to eq(false)
53
+ expect(test_instance.subscribing_to_email?).to eq(false)
34
54
  subscribed_at = Time.current - 1.months
35
55
  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)
56
+ expect(test_instance.subscribing?).to eq(true)
57
+ expect(test_instance.subscribing_to_email?).to eq(true)
38
58
  expect(test_instance.subscribed_at).to eq(subscribed_at)
39
59
  expect(test_instance.subscribed_to_email_at).to eq(subscribed_at)
40
60
  end
@@ -42,11 +62,33 @@ shared_examples_for :subscription_api do
42
62
 
43
63
  context "with false as with_email_subscription" do
44
64
  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)
65
+ expect(test_instance.subscribing?).to eq(false)
66
+ expect(test_instance.subscribing_to_email?).to eq(false)
47
67
  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)
68
+ expect(test_instance.subscribing?).to eq(true)
69
+ expect(test_instance.subscribing_to_email?).to eq(false)
70
+ end
71
+ end
72
+
73
+ context "with optional targets" do
74
+ it "also subscribes to optional targets" do
75
+ test_instance.unsubscribe_to_optional_target(:console_output)
76
+ expect(test_instance.subscribing?).to eq(false)
77
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
78
+ test_instance.subscribe
79
+ expect(test_instance.subscribing?).to eq(true)
80
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(true)
81
+ end
82
+ end
83
+
84
+ context "with false as with_optional_targets" do
85
+ it "does not subscribe to optional targets" do
86
+ test_instance.unsubscribe_to_optional_target(:console_output)
87
+ expect(test_instance.subscribing?).to eq(false)
88
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
89
+ test_instance.subscribe(with_optional_targets: false)
90
+ expect(test_instance.subscribing?).to eq(true)
91
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
50
92
  end
51
93
  end
52
94
  end
@@ -58,12 +100,12 @@ shared_examples_for :subscription_api do
58
100
 
59
101
  context "as default" do
60
102
  it "unsubscribe with current time" do
61
- expect(test_instance.subscribing).to eq(true)
62
- expect(test_instance.subscribing_to_email).to eq(true)
103
+ expect(test_instance.subscribing?).to eq(true)
104
+ expect(test_instance.subscribing_to_email?).to eq(true)
63
105
  Timecop.freeze(Time.current)
64
106
  test_instance.unsubscribe
65
- expect(test_instance.subscribing).to eq(false)
66
- expect(test_instance.subscribing_to_email).to eq(false)
107
+ expect(test_instance.subscribing?).to eq(false)
108
+ expect(test_instance.subscribing_to_email?).to eq(false)
67
109
  expect(test_instance.unsubscribed_at).to eq(Time.current)
68
110
  expect(test_instance.unsubscribed_to_email_at).to eq(Time.current)
69
111
  Timecop.return
@@ -72,12 +114,12 @@ shared_examples_for :subscription_api do
72
114
 
73
115
  context "with unsubscribed_at option" do
74
116
  it "unsubscribe with specified time" do
75
- expect(test_instance.subscribing).to eq(true)
76
- expect(test_instance.subscribing_to_email).to eq(true)
117
+ expect(test_instance.subscribing?).to eq(true)
118
+ expect(test_instance.subscribing_to_email?).to eq(true)
77
119
  unsubscribed_at = Time.current - 1.months
78
120
  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)
121
+ expect(test_instance.subscribing?).to eq(false)
122
+ expect(test_instance.subscribing_to_email?).to eq(false)
81
123
  expect(test_instance.unsubscribed_at).to eq(unsubscribed_at)
82
124
  expect(test_instance.unsubscribed_to_email_at).to eq(unsubscribed_at)
83
125
  end
@@ -91,29 +133,29 @@ shared_examples_for :subscription_api do
91
133
 
92
134
  context "for subscribing instance" do
93
135
  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)
136
+ expect(test_instance.subscribing?).to eq(true)
137
+ expect(test_instance.subscribing_to_email?).to eq(false)
96
138
  expect(test_instance.subscribe_to_email).to be_truthy
97
139
  end
98
140
  end
99
141
 
100
142
  context "for not subscribing instance" do
101
- it "returns false as successfully updated subscription instance" do
143
+ it "returns false as failure to update subscription instance" do
102
144
  test_instance.unsubscribe
103
- expect(test_instance.subscribing).to eq(false)
104
- expect(test_instance.subscribing_to_email).to eq(false)
145
+ expect(test_instance.subscribing?).to eq(false)
146
+ expect(test_instance.subscribing_to_email?).to eq(false)
105
147
  expect(test_instance.subscribe_to_email).to be_falsey
106
148
  end
107
149
  end
108
150
 
109
151
  context "as default" do
110
152
  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)
153
+ expect(test_instance.subscribing?).to eq(true)
154
+ expect(test_instance.subscribing_to_email?).to eq(false)
113
155
  Timecop.freeze(Time.current)
114
156
  test_instance.subscribe_to_email
115
- expect(test_instance.subscribing).to eq(true)
116
- expect(test_instance.subscribing_to_email).to eq(true)
157
+ expect(test_instance.subscribing?).to eq(true)
158
+ expect(test_instance.subscribing_to_email?).to eq(true)
117
159
  expect(test_instance.subscribed_to_email_at).to eq(Time.current)
118
160
  Timecop.return
119
161
  end
@@ -121,12 +163,12 @@ shared_examples_for :subscription_api do
121
163
 
122
164
  context "with subscribed_to_email_at option" do
123
165
  it "subscribe with specified time" do
124
- expect(test_instance.subscribing).to eq(true)
125
- expect(test_instance.subscribing_to_email).to eq(false)
166
+ expect(test_instance.subscribing?).to eq(true)
167
+ expect(test_instance.subscribing_to_email?).to eq(false)
126
168
  subscribed_to_email_at = Time.current - 1.months
127
169
  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)
170
+ expect(test_instance.subscribing?).to eq(true)
171
+ expect(test_instance.subscribing_to_email?).to eq(true)
130
172
  expect(test_instance.subscribed_to_email_at).to eq(subscribed_to_email_at)
131
173
  end
132
174
  end
@@ -139,12 +181,12 @@ shared_examples_for :subscription_api do
139
181
 
140
182
  context "as default" do
141
183
  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)
184
+ expect(test_instance.subscribing?).to eq(true)
185
+ expect(test_instance.subscribing_to_email?).to eq(true)
144
186
  Timecop.freeze(Time.current)
145
187
  test_instance.unsubscribe_to_email
146
- expect(test_instance.subscribing).to eq(true)
147
- expect(test_instance.subscribing_to_email).to eq(false)
188
+ expect(test_instance.subscribing?).to eq(true)
189
+ expect(test_instance.subscribing_to_email?).to eq(false)
148
190
  expect(test_instance.unsubscribed_to_email_at).to eq(Time.current)
149
191
  Timecop.return
150
192
  end
@@ -152,16 +194,139 @@ shared_examples_for :subscription_api do
152
194
 
153
195
  context "with unsubscribed_to_email_at option" do
154
196
  it "unsubscribe with specified time" do
155
- expect(test_instance.subscribing).to eq(true)
156
- expect(test_instance.subscribing_to_email).to eq(true)
197
+ expect(test_instance.subscribing?).to eq(true)
198
+ expect(test_instance.subscribing_to_email?).to eq(true)
157
199
  unsubscribed_to_email_at = Time.current - 1.months
158
200
  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)
201
+ expect(test_instance.subscribing?).to eq(true)
202
+ expect(test_instance.subscribing_to_email?).to eq(false)
161
203
  expect(test_instance.unsubscribed_to_email_at).to eq(unsubscribed_to_email_at)
162
204
  end
163
205
  end
164
206
  end
165
207
 
208
+ describe "#subscribing_to_optional_target?" do
209
+ before do
210
+ test_instance.update(optional_targets: {})
211
+ end
212
+
213
+ context "without configured optional target subscpriotion" do
214
+ context "without subscribe_as_default argument" do
215
+ context "with true as ActivityNotification.config.subscribe_as_default" do
216
+ it "returns true" do
217
+ subscribe_as_default = ActivityNotification.config.subscribe_as_default
218
+ ActivityNotification.config.subscribe_as_default = true
219
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to be_truthy
220
+ ActivityNotification.config.subscribe_as_default = subscribe_as_default
221
+ end
222
+ end
223
+
224
+ context "with false as ActivityNotification.config.subscribe_as_default" do
225
+ it "returns false" do
226
+ subscribe_as_default = ActivityNotification.config.subscribe_as_default
227
+ ActivityNotification.config.subscribe_as_default = false
228
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to be_falsey
229
+ ActivityNotification.config.subscribe_as_default = subscribe_as_default
230
+ end
231
+ end
232
+ end
233
+ end
234
+
235
+ context "with configured subscpriotion" do
236
+ context "subscribing to optional target" do
237
+ it "returns true" do
238
+ test_instance.subscribe_to_optional_target(:console_output)
239
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to be_truthy
240
+ end
241
+ end
242
+
243
+ context "unsubscribed to optional target" do
244
+ it "returns false" do
245
+ test_instance.unsubscribe_to_optional_target(:console_output)
246
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to be_falsey
247
+ end
248
+ end
249
+ end
250
+ end
251
+
252
+ describe "#subscribe_to_optional_target" do
253
+ before do
254
+ test_instance.unsubscribe_to_optional_target(:console_output)
255
+ end
256
+
257
+ context "for subscribing instance" do
258
+ it "returns true as successfully updated subscription instance" do
259
+ expect(test_instance.subscribing?).to eq(true)
260
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
261
+ expect(test_instance.subscribe_to_optional_target(:console_output)).to be_truthy
262
+ end
263
+ end
264
+
265
+ context "for not subscribing instance" do
266
+ it "returns false as failure to update subscription instance" do
267
+ test_instance.unsubscribe
268
+ expect(test_instance.subscribing?).to eq(false)
269
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
270
+ expect(test_instance.subscribe_to_optional_target(:console_output)).to be_falsey
271
+ end
272
+ end
273
+
274
+ context "as default" do
275
+ it "subscribe_to_optional_target with current time" do
276
+ expect(test_instance.subscribing?).to eq(true)
277
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
278
+ Timecop.freeze(Time.current)
279
+ test_instance.subscribe_to_optional_target(:console_output)
280
+ expect(test_instance.subscribing?).to eq(true)
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)
283
+ Timecop.return
284
+ end
285
+ end
286
+
287
+ context "with subscribed_at option" do
288
+ it "subscribe with specified time" do
289
+ expect(test_instance.subscribing?).to eq(true)
290
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
291
+ subscribed_at = Time.current - 1.months
292
+ test_instance.subscribe_to_optional_target(:console_output, subscribed_at: subscribed_at)
293
+ expect(test_instance.subscribing?).to eq(true)
294
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(true)
295
+ expect(test_instance.optional_targets[:subscribed_to_console_output_at]).to eq(subscribed_at)
296
+ end
297
+ end
298
+ end
299
+
300
+ describe "#unsubscribe_to_optional_target" do
301
+ it "returns if successfully updated subscription instance" do
302
+ expect(test_instance.unsubscribe_to_optional_target(:console_output)).to be_truthy
303
+ end
304
+
305
+ context "as default" do
306
+ it "unsubscribe_to_optional_target with current time" do
307
+ expect(test_instance.subscribing?).to eq(true)
308
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(true)
309
+ Timecop.freeze(Time.current)
310
+ test_instance.unsubscribe_to_optional_target(:console_output)
311
+ expect(test_instance.subscribing?).to eq(true)
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)
314
+ Timecop.return
315
+ end
316
+ end
317
+
318
+ context "with unsubscribed_at option" do
319
+ it "unsubscribe with specified time" do
320
+ expect(test_instance.subscribing?).to eq(true)
321
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(true)
322
+ unsubscribed_at = Time.current - 1.months
323
+ test_instance.unsubscribe_to_optional_target(:console_output, unsubscribed_at: unsubscribed_at)
324
+ expect(test_instance.subscribing?).to eq(true)
325
+ expect(test_instance.subscribing_to_optional_target?(:console_output)).to eq(false)
326
+ expect(test_instance.optional_targets[:unsubscribed_to_console_output_at]).to eq(unsubscribed_at)
327
+ end
328
+ end
329
+ end
330
+
166
331
  end
167
332
  end