Skip to content

Commit

Permalink
Feat(Promotions): Implement SolidusPromotions#order_activatable?
Browse files Browse the repository at this point in the history
  • Loading branch information
mamhoff authored and tvdeyen committed Dec 5, 2024
1 parent d7bb895 commit a2e034e
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 9 deletions.
10 changes: 10 additions & 0 deletions promotions/app/models/solidus_promotions/promotion.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

module SolidusPromotions
class Promotion < Spree::Base
UNACTIVATABLE_ORDER_STATES = ["awaiting_return", "returned", "canceled"]

include Spree::SoftDeletable

belongs_to :category, class_name: "SolidusPromotions::PromotionCategory",
Expand Down Expand Up @@ -59,6 +61,14 @@ def self.ordered_lanes
lanes.sort_by(&:last).to_h
end

def self.order_activatable?(order)
return false if UNACTIVATABLE_ORDER_STATES.include?(order.state)
return false if order.shipped?
return false if order.complete? && !SolidusPromotions.config.recalculate_complete_orders

true
end

self.allowed_ransackable_associations = ["codes"]
self.allowed_ransackable_attributes = %w[name customer_label path promotion_category_id lane updated_at]
self.allowed_ransackable_scopes = %i[active with_discarded]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ def expect_adjustment_creation(adjustable:, promotion:)
end
end

describe "#can_apply?", :pending do
describe "#can_apply?" do
let(:order) { double("Order").as_null_object }

subject { described_class.new(order).can_apply? }
Expand Down
52 changes: 52 additions & 0 deletions promotions/spec/models/solidus_promotions/promotion_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -686,4 +686,56 @@
expect(subject).to be_nil
end
end

describe ".order_activatable" do
let(:order) { create :order }

subject { described_class.order_activatable?(order) }

it "is true" do
expect(subject).to be true
end

context "when the order is in the cart state" do
let(:order) { create :order, state: "cart" }

it { is_expected.to be true }
end

context "when the order is shipped" do
let(:order) { create :order, state: "complete", shipment_state: "shipped" }

it { is_expected.to be false }
end

context "when the order is completed but not shipped" do
let(:order) { create :order, state: "complete", shipment_state: "ready" }

it { is_expected.to be true }

context "when the promotion system is configured to prohibit applying promotions to completed orders" do
before { stub_spree_preferences(SolidusPromotions.configuration, recalculate_complete_orders: false) }

it { is_expected.to be false }
end
end

context "when the order is canceled" do
let(:order) { create :order, state: "canceled" }

it { is_expected.to be false }
end

context "when the order is awaiting return" do
let(:order) { create :order, state: "awaiting_return" }

it { is_expected.to be false }
end

context "when the order is returned" do
let(:order) { create :order, state: "returned" }

it { is_expected.to be false }
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

require "rails_helper"

RSpec.describe "Adjustments", :pending, type: :feature do
RSpec.describe "Adjustments", type: :feature do
stub_authorization!

let!(:ship_address) { create(:address) }
Expand All @@ -13,8 +13,10 @@

let(:tax_category) { create(:tax_category) }
let(:variant) { create(:variant, tax_category:) }
let(:preferences) { {} }

before(:each) do
stub_spree_preferences(SolidusPromotions.configuration, preferences)
order.recalculate

visit spree.admin_path
Expand Down Expand Up @@ -43,20 +45,14 @@
end

context "when the promotion system is configured to allow applying promotions to completed orders" do
before do
expect(SolidusPromotions.config).to receive(:recalculate_complete_orders).and_return(true)
end

it "shows input field for promotion code" do
expect(page).to have_content("Adjustments")
expect(page).to have_field("coupon_code")
end
end

context "when the promotion system is configured to not allow applying promotions to completed orders" do
before do
expect(SolidusPromotions.config).to receive(:recalculate_complete_orders).and_return(false)
end
let(:preferences) { { recalculate_complete_orders: false } }

it "does not show input field for promotion code" do
expect(page).to have_content("Adjustments")
Expand Down

0 comments on commit a2e034e

Please sign in to comment.