Skip to content

Commit

Permalink
Only create an order when adding a product to cart
Browse files Browse the repository at this point in the history
Everytime user was authenticated an order was created by visiting any
page in frontend (if none were already associated with the current user)

Fixes #4136
  • Loading branch information
huoxito committed Dec 22, 2013
1 parent d457d63 commit 3516aa3
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 4 deletions.
5 changes: 4 additions & 1 deletion core/lib/spree/core/controller_helpers/order.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@ def self.included(base)
# The current incomplete order from the session for use in cart and during checkout
def current_order(create_order_if_necessary = false)
return @current_order if @current_order

if session[:order_id]
current_order = Spree::Order.includes(:adjustments).find_by(id: session[:order_id], currency: current_currency)
@current_order = current_order unless current_order.try(:completed?)
end

if create_order_if_necessary and (@current_order.nil? or @current_order.completed?)
@current_order = Spree::Order.new(currency: current_currency)
@current_order.user ||= try_spree_current_user
Expand All @@ -29,6 +31,7 @@ def current_order(create_order_if_necessary = false)
session[:access_token] = @current_order.token
end
end

if @current_order
@current_order.last_ip_address = ip_address
session[:order_id] = @current_order.id
Expand All @@ -50,7 +53,7 @@ def set_current_order
last_incomplete_order = user.last_incomplete_spree_order
if session[:order_id].nil? && last_incomplete_order
session[:order_id] = last_incomplete_order.id
elsif current_order(true) && last_incomplete_order && current_order != last_incomplete_order
elsif current_order && last_incomplete_order && current_order != last_incomplete_order
current_order.merge!(last_incomplete_order, user)
end
end
Expand Down
2 changes: 1 addition & 1 deletion frontend/app/controllers/spree/orders_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def update

# Shows the current incomplete order from the session
def edit
@order = current_order(true)
@order = current_order || Order.new
associate_user
end

Expand Down
29 changes: 27 additions & 2 deletions frontend/spec/controllers/spree/current_order_tracking_spec.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
require 'spec_helper'

describe 'current order tracking' do
let(:user) { create(:user) }

controller(Spree::StoreController) do
def index
render :nothing => true
Expand All @@ -15,9 +17,32 @@ def index
end

it 'automatically tracks who the order was created by' do
user = FactoryGirl.create(:user)
controller.stub(:try_spree_current_user => user)
get :index
controller.current_order.created_by.should == controller.try_spree_current_user
controller.current_order(true).created_by.should == controller.try_spree_current_user
end

context "current order creation" do
before { controller.stub(:try_spree_current_user => user) }

it "doesn't create a new order out of the blue" do
expect {
spree_get :index
}.not_to change { Spree::Order.count }
end
end
end

describe Spree::OrdersController do
let(:user) { create(:user) }

before { controller.stub(:try_spree_current_user => user) }

describe Spree::OrdersController do
it "doesn't create a new order out of the blue" do
expect {
spree_get :edit
}.not_to change { Spree::Order.count }
end
end
end
1 change: 1 addition & 0 deletions frontend/spec/controllers/spree/orders_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
end

it "should redirect to cart path (on success)" do
controller.stub current_order: order
order.stub(:update_attributes).and_return true
spree_put :update, {}, {:order_id => 1}
response.should redirect_to(spree.cart_path)
Expand Down

0 comments on commit 3516aa3

Please sign in to comment.