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.
- 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
| @@ -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       : | 
| 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       : | 
| 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  | 
| 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
         |