diff options
4 files changed, 60 insertions, 0 deletions
diff --git a/app/models/solidus_subscriptions/subscription_event.rb b/app/models/solidus_subscriptions/subscription_event.rb new file mode 100644 index 0000000..93552fd --- /dev/null +++ b/app/models/solidus_subscriptions/subscription_event.rb @@ -0,0 +1,22 @@ +module SolidusSubscriptions + class SubscriptionEvent < ApplicationRecord + belongs_to :subscription, class_name: 'SolidusSubscriptions::Subscription', inverse_of: :events + + after_initialize do + self.details ||= {} + end + + after_create :emit_event + + private + + def emit_event + return unless defined?(::Spree::Event) + + ::Spree::Event.fire( + "solidus_subscriptions.#{event_type}", + details.deep_symbolize_keys.merge(subscription: subscription), + ) + end + end +end diff --git a/db/migrate/20200730101242_create_solidus_subscriptions_subscription_events.rb b/db/migrate/20200730101242_create_solidus_subscriptions_subscription_events.rb new file mode 100644 index 0000000..62de91e --- /dev/null +++ b/db/migrate/20200730101242_create_solidus_subscriptions_subscription_events.rb @@ -0,0 +1,17 @@ +class CreateSolidusSubscriptionsSubscriptionEvents < ActiveRecord::Migration[5.2] + def change + create_table :solidus_subscriptions_subscription_events do |t| + t.belongs_to( + :subscription, + null: false, + foreign_key: { to_table: :solidus_subscriptions_subscriptions }, + index: { name: :idx_solidus_subscription_events_on_subscription_id }, + type: :integer, + ) + t.string :event_type, null: false + t.json :details, null: false + + t.timestamps + end + end +end diff --git a/lib/solidus_subscriptions/testing_support/factories/subscription_event_factory.rb b/lib/solidus_subscriptions/testing_support/factories/subscription_event_factory.rb new file mode 100644 index 0000000..0158e2e --- /dev/null +++ b/lib/solidus_subscriptions/testing_support/factories/subscription_event_factory.rb @@ -0,0 +1,6 @@ +FactoryBot.define do + factory :subscription_event, class: 'SolidusSubscriptions::SubscriptionEvent' do + subscription + event_type { 'test_event' } + end +end diff --git a/spec/models/solidus_subscriptions/subscription_event_spec.rb b/spec/models/solidus_subscriptions/subscription_event_spec.rb new file mode 100644 index 0000000..d4602f3 --- /dev/null +++ b/spec/models/solidus_subscriptions/subscription_event_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +RSpec.describe SolidusSubscriptions::SubscriptionEvent do + describe '#save' do + it 'emits a Solidus event' do + event_klass = class_spy('Spree::Event') + stub_const('Spree::Event', event_klass) + + subscription = create(:subscription) + subscription_event = create(:subscription_event, subscription: subscription, event_type: 'test_event', details: { foo: 'bar' }) + + expect(event_klass).to have_received(:fire).with('solidus_subscriptions.test_event', subscription: subscription_event.subscription, foo: 'bar') + end + end +end |