# frozen_string_literal: true

RSpec.describe Notifications::ConsolidateNotifications do
  describe "#before_consolidation_callbacks" do
    fab!(:user)
    let(:rule) do
      described_class.new(
        from: Notification.types[:liked],
        to: Notification.types[:liked],
        consolidation_window: 10.minutes,
        consolidated_query_blk:
          Proc.new { |notifications| notifications.where("(data::json ->> 'consolidated')::bool") },
        threshold: 1,
      ).set_mutations(set_data_blk: Proc.new { |n| n.data_hash.merge(consolidated: true) })
    end

    it "applies a callback when consolidating a notification" do
      rule.before_consolidation_callbacks(
        before_consolidation_blk:
          Proc.new { |_, data| data[:consolidation_callback_called] = true },
      )

      rule.consolidate_or_save!(build_like_notification)
      rule.consolidate_or_save!(build_like_notification)

      consolidated_notification = Notification.where(user: user).last

      expect(consolidated_notification.data_hash[:consolidation_callback_called]).to eq(true)
    end

    it "applies a callback when updating a consolidated notification" do
      rule.before_consolidation_callbacks(
        before_update_blk: Proc.new { |_, data| data[:update_callback_called] = true },
      )

      rule.consolidate_or_save!(build_like_notification)
      rule.consolidate_or_save!(build_like_notification)

      consolidated_notification = Notification.where(user: user).last

      expect(consolidated_notification.data_hash[:update_callback_called]).to be_nil

      rule.consolidate_or_save!(build_like_notification)

      consolidated_notification = Notification.where(user: user).last

      expect(consolidated_notification.data_hash[:update_callback_called]).to eq(true)
    end

    def build_like_notification
      Fabricate.build(
        :notification,
        user: user,
        notification_type: Notification.types[:liked],
        data: {}.to_json,
      )
    end
  end
end