Skip to content

Commit 69eb393

Browse files
committed
Promotions: First Order condition must not fail on canceled orders
The store I work in lets customers cancel their orders, and create a new one in its stead. The feature is described as "Edit your order" to customers. When they do this, the order they then place is perceived to be their first order, and I think we should respect that. Also changes the spec to work with actual records rather than mocking chains.
1 parent f418798 commit 69eb393

File tree

2 files changed

+28
-21
lines changed

2 files changed

+28
-21
lines changed

promotions/app/models/solidus_promotions/conditions/first_order.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ def eligible?(order, options = {})
2020
private
2121

2222
def completed_orders
23-
user ? user.orders.complete : orders_by_email
23+
user ? user.orders.complete.not_canceled : orders_by_email
2424
end
2525

2626
def orders_by_email
27-
Spree::Order.where(email: email).complete
27+
Spree::Order.where(email: email).complete.not_canceled
2828
end
2929
end
3030
end

promotions/spec/models/solidus_promotions/conditions/first_order_spec.rb

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44

55
RSpec.describe SolidusPromotions::Conditions::FirstOrder, type: :model do
66
let(:condition) { described_class.new }
7-
let(:order) { mock_model(Spree::Order, user: nil, email: nil) }
8-
let(:user) { mock_model(Spree::LegacyUser) }
7+
let(:order) { create(:order, user:, email:) }
8+
let(:user) { nil }
9+
let(:email) { nil }
910

1011
describe "#level" do
1112
it "is order" do
@@ -31,36 +32,36 @@
3132

3233
context "first order" do
3334
context "for a signed user" do
34-
context "with no completed orders" do
35-
before do
36-
allow(user).to receive_message_chain(:orders, complete: [])
37-
end
38-
39-
specify do
40-
allow(order).to receive_messages(user: user)
41-
expect(condition).to be_eligible(order)
42-
end
35+
let(:user) { create(:user) }
36+
let(:email) { user.email }
4337

38+
context "with no completed, un-canceled orders" do
4439
it "is eligible when user passed in payload data" do
4540
expect(condition).to be_eligible(order, user: user)
4641
end
4742
end
4843

4944
context "with completed orders" do
50-
before do
51-
allow(order).to receive_messages(user: user)
52-
end
45+
let(:order) { create(:completed_order_with_totals, user:, email:) }
5346

5447
it "is eligible when checked against first completed order" do
55-
allow(user).to receive_message_chain(:orders, complete: [order])
5648
expect(condition).to be_eligible(order)
5749
end
5850

5951
context "with another order" do
60-
before { allow(user).to receive_message_chain(:orders, complete: [mock_model(Spree::Order)]) }
52+
let!(:previous_order) { create(:completed_order_with_totals, user:) }
6153

6254
it { expect(condition).not_to be_eligible(order) }
6355

56+
context "if previous order is canceled" do
57+
before do
58+
previous_order.cancel!
59+
end
60+
61+
it { expect(condition).to be_eligible(order) }
62+
end
63+
64+
6465
it "sets an error message" do
6566
condition.eligible?(order)
6667
expect(condition.eligibility_errors.full_messages.first)
@@ -79,17 +80,23 @@
7980
context "for a guest user" do
8081
let(:email) { "user@solidus.io" }
8182

82-
before { allow(order).to receive_messages email: "user@solidus.io" }
83-
8483
context "with no other orders" do
8584
it { expect(condition).to be_eligible(order) }
8685
end
8786

8887
context "with another order" do
89-
before { allow(condition).to receive_messages(orders_by_email: [mock_model(Spree::Order)]) }
88+
let!(:previous_order) { create(:completed_order_with_totals, user: nil, email:) }
9089

9190
it { expect(condition).not_to be_eligible(order) }
9291

92+
context "if previous order is canceled" do
93+
before do
94+
previous_order.cancel!
95+
end
96+
97+
it { expect(condition).to be_eligible(order) }
98+
end
99+
93100
it "sets an error message" do
94101
condition.eligible?(order)
95102
expect(condition.eligibility_errors.full_messages.first)

0 commit comments

Comments
 (0)