activity_notification 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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