summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/solidus_subscriptions/subscription_event.rb22
-rw-r--r--db/migrate/20200730101242_create_solidus_subscriptions_subscription_events.rb17
-rw-r--r--lib/solidus_subscriptions/testing_support/factories/subscription_event_factory.rb6
-rw-r--r--spec/models/solidus_subscriptions/subscription_event_spec.rb15
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