Skip to content

Commit

Permalink
Merge pull request #56 from friendlycart/rake-tasks
Browse files Browse the repository at this point in the history
Add a rake task to migrate adjustments from legacy promotions
  • Loading branch information
mamhoff authored Oct 26, 2023
2 parents db11fc2 + 481447c commit 700aa86
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# frozen_string_literal: true

module SolidusFriendlyPromotions
class MigrateAdjustments
class << self
def up
sql = if ActiveRecord::Base.connection_db_config.adapter == "mysql2"
<<~SQL
UPDATE spree_adjustments
INNER JOIN spree_promotion_actions ON spree_adjustments.source_id = spree_promotion_actions.id and spree_adjustments.source_type = 'Spree::PromotionAction'
INNER JOIN friendly_promotion_actions ON friendly_promotion_actions.original_promotion_action_id = spree_promotion_actions.id
SET source_id = friendly_promotion_actions.id,
source_type = 'SolidusFriendlyPromotions::PromotionAction'
SQL
else
<<~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
end

execute(sql)
end

def down
sql = if ActiveRecord::Base.connection_db_config.adapter == "mysql2"
<<~SQL
UPDATE spree_adjustments
INNER JOIN friendly_promotion_actions
INNER JOIN spree_promotion_actions ON spree_adjustments.source_id = friendly_promotion_actions.id and spree_adjustments.source_type = 'SolidusFriendlyPromotions::PromotionAction'
SET source_id = spree_promotion_actions.id,
source_type = 'Spree::PromotionAction'
WHERE friendly_promotion_actions.original_promotion_action_id = spree_promotion_actions.id
SQL
else
<<~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
end

execute(sql)
end

private

def execute(sql)
Spree::Adjustment.transaction do
ActiveRecord::Base.connection.execute(sql)
end
end
end
end
end
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
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 700aa86

Please sign in to comment.