Skip to content
This repository was archived by the owner on Feb 19, 2025. It is now read-only.

Commit

Permalink
Add a rake task to migrate adjustments from legacy promotions
Browse files Browse the repository at this point in the history
Also has a task to migrate back.
  • Loading branch information
mamhoff committed Oct 25, 2023
1 parent f2fa2f7 commit b1f4d07
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 0 deletions.
41 changes: 41 additions & 0 deletions lib/solidus_friendly_promotions/migrate_adjustments.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# frozen_string_literal: true

module SolidusFriendlyPromotions
class MigrateAdjustments
class << self
def up
sql = <<~SQL
UPDATE spree_adjustments
SET source_id = friendly_promotion_actions.id,
source_type = 'SolidusFriendlyPromotions::PromotionAction'
FROM spree_promotion_actions
INNER JOIN friendly_promotion_actions ON friendly_promotion_actions.original_promotion_action_id = spree_promotion_actions.id
WHERE spree_adjustments.source_id = spree_promotion_actions.id and spree_adjustments.source_type = 'Spree::PromotionAction'
SQL

execute(sql)
end

def down
sql = <<~SQL
UPDATE spree_adjustments
SET source_id = spree_promotion_actions.id,
source_type = 'Spree::PromotionAction'
FROM spree_promotion_actions
INNER JOIN friendly_promotion_actions ON friendly_promotion_actions.original_promotion_action_id = spree_promotion_actions.id
WHERE spree_adjustments.source_id = friendly_promotion_actions.id and spree_adjustments.source_type = 'SolidusFriendlyPromotions::PromotionAction'
SQL

execute(sql)
end

private

def execute(sql)
Spree::Adjustment.transaction do
ActiveRecord::Base.connection.execute(sql)
end
end
end
end
end
17 changes: 17 additions & 0 deletions lib/tasks/solidus_friendly_promotions/migrate_adjustments.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

namespace :solidus_friendly_promotions do
namespace :migrate_adjustments do
desc "Migrate adjustments with Spree::PromotionAction sources to SolidusFriendlyPromotions::PromotionAction sources"
task up: :environment do
require "solidus_friendly_promotions/migrate_adjustments"
SolidusFriendlyPromotions::MigrateAdjustments.up
end

desc "Migrate adjustments with SolidusFriendlyPromotions::PromotionAction sources to Spree::PromotionAction sources"
task down: :environment do
require "solidus_friendly_promotions/migrate_adjustments"
SolidusFriendlyPromotions::MigrateAdjustments.down
end
end
end
74 changes: 74 additions & 0 deletions spec/lib/solidus_friendly_promotions/migrate_adjustments_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# frozen_string_literal: true

require "spec_helper"
require "solidus_friendly_promotions/promotion_migrator"
require "solidus_friendly_promotions/promotion_map"
require "solidus_friendly_promotions/migrate_adjustments"

RSpec.describe SolidusFriendlyPromotions::MigrateAdjustments do
let(:promotion) { create(:promotion, :with_adjustable_action) }
let(:order) { create(:order_with_line_items) }
let(:line_item) { order.line_items.first }
let(:tax_rate) { create(:tax_rate) }

before do
line_item.adjustments.create!(
source: tax_rate,
amount: -3,
label: "Business tax",
eligible: true,
included: true,
order: order
)
line_item.adjustments.create!(
source: promotion.actions.first,
amount: -2,
label: "Promotion (Because we like you)",
eligible: true,
order: order
)
SolidusFriendlyPromotions::PromotionMigrator.new(
SolidusFriendlyPromotions::PROMOTION_MAP
).call
end

describe ".up" do
subject { described_class.up }

it "migrates our adjustment" do
spree_promotion_action = Spree::PromotionAction.first
friendly_promotion_action = SolidusFriendlyPromotions::PromotionAction.first
expect { subject }.to change {
Spree::Adjustment.promotion.first.source
}.from(spree_promotion_action).to(friendly_promotion_action)
end

it "will not touch tax adjustments" do
expect { subject }.not_to change {
Spree::Adjustment.tax.first.attributes
}
end
end

describe ".down" do
subject { described_class.down }

before do
described_class.up
end

it "migrates our adjustment" do
spree_promotion_action = Spree::PromotionAction.first
friendly_promotion_action = SolidusFriendlyPromotions::PromotionAction.first
expect { subject }.to change {
Spree::Adjustment.promotion.first.source
}.from(friendly_promotion_action).to(spree_promotion_action)
end

it "will not touch tax adjustments" do
expect { subject }.not_to change {
Spree::Adjustment.tax.first.attributes
}
end
end
end

0 comments on commit b1f4d07

Please sign in to comment.