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.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +23 -11
- data/Gemfile.lock +52 -40
- data/README.md +177 -14
- data/activity_notification.gemspec +3 -1
- data/app/controllers/activity_notification/subscriptions_controller.rb +48 -2
- data/app/views/activity_notification/optional_targets/default/base/_default.text.erb +10 -0
- data/app/views/activity_notification/optional_targets/default/slack/_default.text.erb +6 -0
- data/app/views/activity_notification/subscriptions/default/_notification_keys.html.erb +19 -0
- data/app/views/activity_notification/subscriptions/default/_subscription.html.erb +32 -3
- data/app/views/activity_notification/subscriptions/default/index.html.erb +4 -0
- data/app/views/activity_notification/subscriptions/default/show.html.erb +5 -0
- data/app/views/activity_notification/subscriptions/default/subscribe_to_optional_target.js.erb +6 -0
- data/app/views/activity_notification/subscriptions/default/unsubscribe_to_optional_target.js.erb +6 -0
- data/gemfiles/Gemfile.rails-4.2.lock +15 -3
- data/gemfiles/Gemfile.rails-5.0.lock +47 -35
- data/lib/activity_notification.rb +1 -0
- data/lib/activity_notification/apis/notification_api.rb +83 -26
- data/lib/activity_notification/apis/subscription_api.rb +93 -8
- data/lib/activity_notification/common.rb +6 -2
- data/lib/activity_notification/helpers/view_helpers.rb +43 -0
- data/lib/activity_notification/models/concerns/notifiable.rb +73 -28
- data/lib/activity_notification/models/concerns/subscriber.rb +34 -7
- data/lib/activity_notification/models/concerns/target.rb +25 -13
- data/lib/activity_notification/models/subscription.rb +13 -2
- data/lib/activity_notification/optional_targets/amazon_sns.rb +42 -0
- data/lib/activity_notification/optional_targets/base.rb +79 -0
- data/lib/activity_notification/optional_targets/slack.rb +33 -0
- data/lib/activity_notification/rails/routes.rb +30 -20
- data/lib/activity_notification/roles/acts_as_notifiable.rb +70 -11
- data/lib/activity_notification/version.rb +1 -1
- data/lib/generators/activity_notification/views_generator.rb +2 -2
- data/lib/generators/templates/migrations/migration.rb +2 -2
- data/spec/concerns/apis/notification_api_spec.rb +97 -0
- data/spec/concerns/apis/subscription_api_spec.rb +206 -41
- data/spec/concerns/common_spec.rb +7 -2
- data/spec/concerns/models/notifiable_spec.rb +88 -2
- data/spec/concerns/models/subscriber_spec.rb +114 -13
- data/spec/concerns/models/target_spec.rb +17 -0
- data/spec/controllers/subscriptions_controller_shared_examples.rb +251 -28
- data/spec/helpers/view_helpers_spec.rb +56 -0
- data/spec/optional_targets/amazon_sns_spec.rb +46 -0
- data/spec/optional_targets/base_spec.rb +43 -0
- data/spec/optional_targets/slack_spec.rb +46 -0
- data/spec/rails_app/app/controllers/comments_controller.rb +1 -0
- data/spec/rails_app/app/models/admin.rb +1 -2
- data/spec/rails_app/app/models/article.rb +2 -3
- data/spec/rails_app/app/models/comment.rb +19 -7
- data/spec/rails_app/app/views/activity_notification/optional_targets/admins/amazon_sns/comment/_default.text.erb +8 -0
- data/spec/rails_app/db/migrate/20160715050420_create_activity_notification_tables.rb +1 -1
- data/spec/rails_app/db/migrate/20160715050433_create_test_tables.rb +2 -0
- data/spec/rails_app/db/schema.rb +3 -1
- data/spec/rails_app/db/seeds.rb +1 -1
- data/spec/rails_app/lib/custom_optional_targets/console_output.rb +13 -0
- data/spec/rails_app/lib/custom_optional_targets/wrong_target.rb +10 -0
- data/spec/roles/acts_as_notifiable_spec.rb +124 -2
- metadata +49 -4
- data/spec/rails_app/app/models/notification.rb +0 -6
@@ -377,6 +377,34 @@ describe ActivityNotification::ViewHelpers, type: :helper do
|
|
377
377
|
end
|
378
378
|
end
|
379
379
|
|
380
|
+
describe '#subscribe_to_optional_target_subscription_path_for' do
|
381
|
+
it "returns path for the subscription target" do
|
382
|
+
expect(subscribe_to_optional_target_subscription_path_for(subscription))
|
383
|
+
.to eq(subscribe_to_optional_target_user_subscription_path(target_user, subscription))
|
384
|
+
end
|
385
|
+
end
|
386
|
+
|
387
|
+
describe '#subscribe_to_optional_target_path_for' do
|
388
|
+
it "returns path for the subscription target" do
|
389
|
+
expect(subscribe_to_optional_target_path_for(subscription))
|
390
|
+
.to eq(subscribe_to_optional_target_user_subscription_path(target_user, subscription))
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
describe '#unsubscribe_to_optional_target_subscription_path_for' do
|
395
|
+
it "returns path for the subscription target" do
|
396
|
+
expect(unsubscribe_to_optional_target_subscription_path_for(subscription))
|
397
|
+
.to eq(unsubscribe_to_optional_target_user_subscription_path(target_user, subscription))
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
describe '#unsubscribe_to_optional_target_path_for' do
|
402
|
+
it "returns path for the subscription target" do
|
403
|
+
expect(unsubscribe_to_optional_target_path_for(subscription))
|
404
|
+
.to eq(unsubscribe_to_optional_target_user_subscription_path(target_user, subscription))
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
380
408
|
describe '#subscriptions_url_for' do
|
381
409
|
it "returns url for the subscription target" do
|
382
410
|
expect(subscriptions_url_for(target_user))
|
@@ -447,4 +475,32 @@ describe ActivityNotification::ViewHelpers, type: :helper do
|
|
447
475
|
end
|
448
476
|
end
|
449
477
|
|
478
|
+
describe '#subscribe_to_optional_target_subscription_url_for' do
|
479
|
+
it "returns url for the subscription target" do
|
480
|
+
expect(subscribe_to_optional_target_subscription_url_for(subscription))
|
481
|
+
.to eq(subscribe_to_optional_target_user_subscription_url(target_user, subscription))
|
482
|
+
end
|
483
|
+
end
|
484
|
+
|
485
|
+
describe '#subscribe_to_optional_target_url_for' do
|
486
|
+
it "returns url for the subscription target" do
|
487
|
+
expect(subscribe_to_optional_target_url_for(subscription))
|
488
|
+
.to eq(subscribe_to_optional_target_user_subscription_url(target_user, subscription))
|
489
|
+
end
|
490
|
+
end
|
491
|
+
|
492
|
+
describe '#unsubscribe_to_optional_target_subscription_url_for' do
|
493
|
+
it "returns url for the subscription target" do
|
494
|
+
expect(unsubscribe_to_optional_target_subscription_url_for(subscription))
|
495
|
+
.to eq(unsubscribe_to_optional_target_user_subscription_url(target_user, subscription))
|
496
|
+
end
|
497
|
+
end
|
498
|
+
|
499
|
+
describe '#unsubscribe_to_optional_target_url_for' do
|
500
|
+
it "returns url for the subscription target" do
|
501
|
+
expect(unsubscribe_to_optional_target_url_for(subscription))
|
502
|
+
.to eq(unsubscribe_to_optional_target_user_subscription_url(target_user, subscription))
|
503
|
+
end
|
504
|
+
end
|
505
|
+
|
450
506
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'activity_notification/optional_targets/amazon_sns'
|
2
|
+
describe ActivityNotification::OptionalTarget::AmazonSNS do
|
3
|
+
let(:test_instance) { ActivityNotification::OptionalTarget::AmazonSNS.new }
|
4
|
+
|
5
|
+
describe "as public instance methods" do
|
6
|
+
describe "#to_optional_target_name" do
|
7
|
+
it "is return demodulized symbol class name" do
|
8
|
+
expect(test_instance.to_optional_target_name).to eq(:amazon_sns)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#initialize_target" do
|
13
|
+
#TODO
|
14
|
+
it "does not raise NotImplementedError" do
|
15
|
+
expect { test_instance.initialize_target }
|
16
|
+
.not_to raise_error(NotImplementedError)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#notify" do
|
21
|
+
#TODO
|
22
|
+
it "raises NotImplementedError" do
|
23
|
+
expect { test_instance.notify(create(:notification)) }
|
24
|
+
.not_to raise_error(NotImplementedError)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "as protected instance methods" do
|
30
|
+
describe "#render_notification_message" do
|
31
|
+
context "as default" do
|
32
|
+
it "renders notification message with default template" do
|
33
|
+
expect(test_instance.send(:render_notification_message, create(:notification))).to be_include("Move to notified")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "with unexisting template as fallback option" do
|
38
|
+
it "raise ActionView::MissingTemplate" do
|
39
|
+
expect { expect(test_instance.send(:render_notification_message, create(:notification), fallback: :hoge)) }
|
40
|
+
.to raise_error(ActionView::MissingTemplate)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
describe ActivityNotification::OptionalTarget::Base do
|
2
|
+
let(:test_instance) { ActivityNotification::OptionalTarget::Base.new }
|
3
|
+
|
4
|
+
describe "as public instance methods" do
|
5
|
+
describe "#to_optional_target_name" do
|
6
|
+
it "is return demodulized symbol class name" do
|
7
|
+
expect(test_instance.to_optional_target_name).to eq(:base)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#initialize_target" do
|
12
|
+
it "raises NotImplementedError" do
|
13
|
+
expect { test_instance.initialize_target }
|
14
|
+
.to raise_error(NotImplementedError, /You have to implement ActivityNotification::OptionalTarget::Base#initialize_target/)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#notify" do
|
19
|
+
it "raises NotImplementedError" do
|
20
|
+
expect { test_instance.notify(create(:notification)) }
|
21
|
+
.to raise_error(NotImplementedError, /You have to implement ActivityNotification::OptionalTarget::Base#notify/)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "as protected instance methods" do
|
27
|
+
describe "#render_notification_message" do
|
28
|
+
context "as default" do
|
29
|
+
it "renders notification message with default template" do
|
30
|
+
expect(test_instance.send(:render_notification_message, create(:notification))).to be_include("Move to notified")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "with unexisting template as fallback option" do
|
35
|
+
it "raise ActionView::MissingTemplate" do
|
36
|
+
expect { expect(test_instance.send(:render_notification_message, create(:notification), fallback: :hoge)) }
|
37
|
+
.to raise_error(ActionView::MissingTemplate)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'activity_notification/optional_targets/slack'
|
2
|
+
describe ActivityNotification::OptionalTarget::Slack do
|
3
|
+
let(:test_instance) { ActivityNotification::OptionalTarget::Slack.new }
|
4
|
+
|
5
|
+
describe "as public instance methods" do
|
6
|
+
describe "#to_optional_target_name" do
|
7
|
+
it "is return demodulized symbol class name" do
|
8
|
+
expect(test_instance.to_optional_target_name).to eq(:slack)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#initialize_target" do
|
13
|
+
#TODO
|
14
|
+
it "does not raise NotImplementedError" do
|
15
|
+
expect { test_instance.initialize_target }
|
16
|
+
.not_to raise_error(NotImplementedError)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#notify" do
|
21
|
+
#TODO
|
22
|
+
it "raises NotImplementedError" do
|
23
|
+
expect { test_instance.notify(create(:notification)) }
|
24
|
+
.not_to raise_error(NotImplementedError)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "as protected instance methods" do
|
30
|
+
describe "#render_notification_message" do
|
31
|
+
context "as default" do
|
32
|
+
it "renders notification message with slack default template" do
|
33
|
+
expect(test_instance.send(:render_notification_message, create(:notification))).to be_include("<!channel>")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "with unexisting template as fallback option" do
|
38
|
+
it "raise ActionView::MissingTemplate" do
|
39
|
+
expect { expect(test_instance.send(:render_notification_message, create(:notification), fallback: :hoge)) }
|
40
|
+
.to raise_error(ActionView::MissingTemplate)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -2,8 +2,7 @@ class Admin < ActiveRecord::Base
|
|
2
2
|
belongs_to :user
|
3
3
|
validates :user, presence: true
|
4
4
|
|
5
|
-
acts_as_notification_target
|
6
|
-
email_allowed: ->(admin, key) { admin.user.confirmed_at.present? },
|
5
|
+
acts_as_notification_target email_allowed: false,
|
7
6
|
subscription_allowed: true,
|
8
7
|
devise_resource: :user,
|
9
8
|
printable_name: ->(admin) { "admin (#{admin.user.name})" }
|
@@ -5,9 +5,8 @@ class Article < ActiveRecord::Base
|
|
5
5
|
validates :user, presence: true
|
6
6
|
|
7
7
|
acts_as_notifiable :users,
|
8
|
-
targets: ->(article
|
9
|
-
notifier: :user,
|
10
|
-
email_allowed: true,
|
8
|
+
targets: ->(article) { User.all.to_a - [article.user] },
|
9
|
+
notifier: :user, email_allowed: true,
|
11
10
|
printable_name: ->(article) { "new article \"#{article.title}\"" },
|
12
11
|
dependent_notifications: :delete_all
|
13
12
|
acts_as_notification_group printable_name: ->(article) { "article \"#{article.title}\"" }
|
@@ -5,16 +5,28 @@ class Comment < ActiveRecord::Base
|
|
5
5
|
validates :user, presence: true
|
6
6
|
|
7
7
|
acts_as_notifiable :users,
|
8
|
-
targets: ->(comment, key) {
|
9
|
-
|
10
|
-
},
|
11
|
-
group: :article,
|
12
|
-
notifier: :user,
|
13
|
-
email_allowed: true,
|
8
|
+
targets: ->(comment, key) { ([comment.article.user] + comment.article.commented_users.to_a - [comment.user]).uniq },
|
9
|
+
group: :article, notifier: :user, email_allowed: true,
|
14
10
|
parameters: { test_default_param: '1' },
|
15
11
|
notifiable_path: :article_notifiable_path,
|
16
12
|
printable_name: ->(comment) { "comment \"#{comment.body}\"" },
|
17
|
-
dependent_notifications: :
|
13
|
+
dependent_notifications: :update_group_and_delete_all
|
14
|
+
|
15
|
+
# require 'activity_notification/optional_targets/amazon_sns'
|
16
|
+
# require 'activity_notification/optional_targets/slack'
|
17
|
+
require 'custom_optional_targets/console_output'
|
18
|
+
acts_as_notifiable :admins, targets: Admin.all,
|
19
|
+
group: :article, notifier: :user, notifiable_path: :article_notifiable_path,
|
20
|
+
printable_name: ->(comment) { "comment \"#{comment.body}\"" }, dependent_notifications: :delete_all,
|
21
|
+
optional_targets: {
|
22
|
+
# ActivityNotification::OptionalTarget::AmazonSNS => { topic_arn: 'arn:aws:sns:XXXXX:XXXXXXXXXXXX:XXXXX' },
|
23
|
+
# # ActivityNotification::OptionalTarget::AmazonSNS => { phone_number: :phone_number },
|
24
|
+
# ActivityNotification::OptionalTarget::Slack => {
|
25
|
+
# webhook_url: 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX',
|
26
|
+
# slack_name: :slack_name, channel: 'activity_notification', username: 'ActivityNotification', icon_emoji: ":ghost:"
|
27
|
+
# },
|
28
|
+
CustomOptionalTarget::ConsoleOutput => {}
|
29
|
+
}
|
18
30
|
|
19
31
|
def article_notifiable_path
|
20
32
|
article_path(article)
|
@@ -0,0 +1,8 @@
|
|
1
|
+
[This notification is delivered by ActivityNotification with Amazon SNS]
|
2
|
+
|
3
|
+
Dear <%= @target.printable_target_name %>
|
4
|
+
|
5
|
+
<%= @notification.notifier.present? ? @notification.notifier.printable_notifier_name : 'Someone' %> notified you of <%= @notification.notifiable.printable_notifiable_name(@notification.target) %><%= " in #{@notification.group.printable_group_name}" if @notification.group.present? %>.
|
6
|
+
|
7
|
+
<%= "Move to notified #{@notification.notifiable.printable_type.downcase}:" %>
|
8
|
+
<%= move_notification_url_for(@notification, open: true) %>
|
data/spec/rails_app/db/schema.rb
CHANGED
@@ -14,6 +14,8 @@ ActiveRecord::Schema.define(version: 20160715050433) do
|
|
14
14
|
|
15
15
|
create_table "admins", force: :cascade do |t|
|
16
16
|
t.integer "user_id"
|
17
|
+
t.string "phone_number"
|
18
|
+
t.string "slack_name"
|
17
19
|
t.datetime "created_at"
|
18
20
|
t.datetime "updated_at"
|
19
21
|
t.index ["user_id"], name: "index_admins_on_user_id"
|
@@ -70,7 +72,7 @@ ActiveRecord::Schema.define(version: 20160715050433) do
|
|
70
72
|
t.datetime "unsubscribed_at"
|
71
73
|
t.datetime "subscribed_to_email_at"
|
72
74
|
t.datetime "unsubscribed_to_email_at"
|
73
|
-
t.text "
|
75
|
+
t.text "optional_targets"
|
74
76
|
t.datetime "created_at"
|
75
77
|
t.datetime "updated_at"
|
76
78
|
t.index ["key"], name: "index_subscriptions_on_key"
|
data/spec/rails_app/db/seeds.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
module CustomOptionalTarget
|
2
|
+
# Optional target implementation for mobile push notification or SMS using AWS SNS.
|
3
|
+
class ConsoleOutput < ActivityNotification::OptionalTarget::Base
|
4
|
+
def initialize_target(options = {})
|
5
|
+
end
|
6
|
+
|
7
|
+
def notify(notification, options = {})
|
8
|
+
puts "----- Optional targets: #{self.class.name} -----"
|
9
|
+
puts render_notification_message(notification, options)
|
10
|
+
puts "-----------------------------------------------------------------"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -1,8 +1,15 @@
|
|
1
1
|
describe ActivityNotification::ActsAsNotifiable do
|
2
|
-
let(:dummy_model_class)
|
2
|
+
let(:dummy_model_class) { Dummy::DummyBase }
|
3
|
+
let(:dummy_notifiable_class) { Dummy::DummyNotifiable }
|
4
|
+
let(:dummy_target) { create(:dummy_target) }
|
3
5
|
|
4
6
|
describe "as public class methods" do
|
5
7
|
describe ".acts_as_notifiable" do
|
8
|
+
before do
|
9
|
+
dummy_notifiable_class.set_notifiable_class_defaults
|
10
|
+
@notifiable = dummy_notifiable_class.create
|
11
|
+
end
|
12
|
+
|
6
13
|
it "have not included Notifiable before calling" do
|
7
14
|
expect(dummy_model_class.respond_to?(:available_as_notifiable?)).to be_falsey
|
8
15
|
end
|
@@ -19,13 +26,128 @@ describe ActivityNotification::ActsAsNotifiable do
|
|
19
26
|
end
|
20
27
|
end
|
21
28
|
|
29
|
+
context "with :dependent_notifications option" do
|
30
|
+
before do
|
31
|
+
dummy_notifiable_class.reset_callbacks :destroy
|
32
|
+
@notifiable_1, @notifiable_2, @notifiable_3 = dummy_notifiable_class.create, dummy_notifiable_class.create, dummy_notifiable_class.create
|
33
|
+
@group_owner = create(:notification, target: dummy_target, notifiable: @notifiable_1, group: @notifiable_1)
|
34
|
+
@group_member = create(:notification, target: dummy_target, notifiable: @notifiable_2, group: @notifiable_1, group_owner: @group_owner)
|
35
|
+
create(:notification, target: dummy_target, notifiable: @notifiable_3, group: @notifiable_1, group_owner: @group_owner)
|
36
|
+
expect(@group_owner.group_member_count).to eq(2)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns hash of :dependent_notifications option" do
|
40
|
+
expect(dummy_notifiable_class.acts_as_notifiable :users, dependent_notifications: :restrict_with_exception)
|
41
|
+
.to eq({ dependent_notifications: :restrict_with_exception })
|
42
|
+
end
|
43
|
+
|
44
|
+
context "without option" do
|
45
|
+
it "does not deletes any notifications when notifiable is deleted" do
|
46
|
+
dummy_notifiable_class.acts_as_notifiable :users
|
47
|
+
expect(dummy_target.notifications.reload.size).to eq(3)
|
48
|
+
expect { @notifiable_1.destroy }.to change(dummy_notifiable_class, :count).by(-1)
|
49
|
+
expect(dummy_target.notifications.reload.size).to eq(3)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context ":delete_all" do
|
54
|
+
it "deletes all notifications when notifiable is deleted" do
|
55
|
+
dummy_notifiable_class.acts_as_notifiable :users, dependent_notifications: :delete_all
|
56
|
+
expect(dummy_target.notifications.reload.size).to eq(3)
|
57
|
+
expect { @notifiable_1.destroy }.to change(dummy_notifiable_class, :count).by(-1)
|
58
|
+
expect(dummy_target.notifications.reload.size).to eq(2)
|
59
|
+
expect(@group_member.reload.group_owner?).to be_falsey
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context ":destroy" do
|
64
|
+
it "destroies all notifications when notifiable is deleted" do
|
65
|
+
dummy_notifiable_class.acts_as_notifiable :users, dependent_notifications: :destroy
|
66
|
+
expect(dummy_target.notifications.reload.size).to eq(3)
|
67
|
+
expect { @notifiable_1.destroy }.to change(dummy_notifiable_class, :count).by(-1)
|
68
|
+
expect(dummy_target.notifications.reload.size).to eq(2)
|
69
|
+
expect(@group_member.reload.group_owner?).to be_falsey
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context ":restrict_with_exception" do
|
74
|
+
it "can not be deleted when it has generated notifications" do
|
75
|
+
dummy_notifiable_class.acts_as_notifiable :users, dependent_notifications: :restrict_with_exception
|
76
|
+
expect(dummy_target.notifications.reload.size).to eq(3)
|
77
|
+
expect { @notifiable_1.destroy }.to raise_error(ActiveRecord::DeleteRestrictionError)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context ":update_group_and_delete_all" do
|
82
|
+
it "deletes all notifications and update notification group when notifiable is deleted" do
|
83
|
+
dummy_notifiable_class.acts_as_notifiable :users, dependent_notifications: :update_group_and_delete_all
|
84
|
+
expect(dummy_target.notifications.reload.size).to eq(3)
|
85
|
+
expect { @notifiable_1.destroy }.to change(dummy_notifiable_class, :count).by(-1)
|
86
|
+
expect(dummy_target.notifications.reload.size).to eq(2)
|
87
|
+
expect(@group_member.reload.group_owner?).to be_truthy
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context ":update_group_and_destroy" do
|
92
|
+
it "destroies all notifications and update notification group when notifiable is deleted" do
|
93
|
+
dummy_notifiable_class.acts_as_notifiable :users, dependent_notifications: :update_group_and_destroy
|
94
|
+
expect(dummy_target.notifications.reload.size).to eq(3)
|
95
|
+
expect { @notifiable_1.destroy }.to change(dummy_notifiable_class, :count).by(-1)
|
96
|
+
expect(dummy_target.notifications.reload.size).to eq(2)
|
97
|
+
expect(@group_member.reload.group_owner?).to be_truthy
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "with :optional_targets option" do
|
103
|
+
require 'custom_optional_targets/console_output'
|
104
|
+
require 'custom_optional_targets/wrong_target'
|
105
|
+
|
106
|
+
it "returns hash of :optional_targets option" do
|
107
|
+
result_hash = dummy_notifiable_class.acts_as_notifiable :users, optional_targets: { CustomOptionalTarget::ConsoleOutput => {} }
|
108
|
+
expect(result_hash).to be_a(Hash)
|
109
|
+
expect(result_hash[:optional_targets]).to be_a(Array)
|
110
|
+
expect(result_hash[:optional_targets].first).to be_a(CustomOptionalTarget::ConsoleOutput)
|
111
|
+
end
|
112
|
+
|
113
|
+
context "without option" do
|
114
|
+
it "does not configure optional_targets and notifiable#optional_targets returns empty array" do
|
115
|
+
dummy_notifiable_class.acts_as_notifiable :users
|
116
|
+
expect(@notifiable.optional_targets(:users)).to eq([])
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context "with hash configuration" do
|
121
|
+
it "configure optional_targets and notifiable#optional_targets returns optional_target array" do
|
122
|
+
dummy_notifiable_class.acts_as_notifiable :users, optional_targets: { CustomOptionalTarget::ConsoleOutput => {} }
|
123
|
+
expect(@notifiable.optional_targets(:users)).to be_a(Array)
|
124
|
+
expect(@notifiable.optional_targets(:users).first).to be_a(CustomOptionalTarget::ConsoleOutput)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context "with hash configuration but specified class does not extends ActivityNotification::OptionalTarget::Base" do
|
129
|
+
it "raise TypeError" do
|
130
|
+
expect { dummy_notifiable_class.acts_as_notifiable :users, optional_targets: { CustomOptionalTarget::WrongTarget => {} } }
|
131
|
+
.to raise_error(TypeError, /.+ is not a kind of ActivityNotification::OptionalTarget::Base/)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context "with lambda function configuration" do
|
136
|
+
it "configure optional_targets and notifiable#optional_targets returns optional_target array" do
|
137
|
+
dummy_notifiable_class.acts_as_notifiable :users, optional_targets: ->(notifiable, key){ key == 'dummy_key' ? [ActivityNotification::OptionalTarget::Base.new] : [] }
|
138
|
+
expect(@notifiable.optional_targets(:users)).to eq([])
|
139
|
+
expect(@notifiable.optional_targets(:users, 'dummy_key').first).to be_a(ActivityNotification::OptionalTarget::Base)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
22
144
|
#TODO test other options
|
23
145
|
end
|
24
146
|
|
25
147
|
describe ".available_notifiable_options" do
|
26
148
|
it "returns list of available options in acts_as_notifiable" do
|
27
149
|
expect(dummy_model_class.available_notifiable_options)
|
28
|
-
.to eq([:targets, :group, :group_expiry_delay, :notifier, :parameters, :email_allowed, :notifiable_path, :printable_notifiable_name, :printable_name, :dependent_notifications])
|
150
|
+
.to eq([:targets, :group, :group_expiry_delay, :notifier, :parameters, :email_allowed, :notifiable_path, :printable_notifiable_name, :printable_name, :dependent_notifications, :optional_targets])
|
29
151
|
end
|
30
152
|
end
|
31
153
|
end
|