diff --git a/app/controllers/spree/checkout_controller_decorator.rb b/app/controllers/spree/checkout_controller_decorator.rb index c8d20b8..c2b91d2 100644 --- a/app/controllers/spree/checkout_controller_decorator.rb +++ b/app/controllers/spree/checkout_controller_decorator.rb @@ -90,10 +90,11 @@ module Spree @order.ship_address = order_ship_address @order.bill_address ||= order_ship_address end - + @order.state = "payment" @order.save if payment_method.preferred_review + @order.next render 'spree/shared/paypal_express_confirm' else paypal_finish diff --git a/app/models/spree/billing_integration/paypal_express.rb b/app/models/spree/billing_integration/paypal_express.rb index 9509b67..389e162 100644 --- a/app/models/spree/billing_integration/paypal_express.rb +++ b/app/models/spree/billing_integration/paypal_express.rb @@ -12,4 +12,8 @@ class Spree::BillingIntegration::PaypalExpress < Spree::BillingIntegration def provider_class ActiveMerchant::Billing::PaypalExpressGateway end + + def payment_profiles_supported? + !!preferred_review + end end diff --git a/app/models/spree/billing_integration/paypal_express_uk.rb b/app/models/spree/billing_integration/paypal_express_uk.rb index 7021b37..2c18503 100644 --- a/app/models/spree/billing_integration/paypal_express_uk.rb +++ b/app/models/spree/billing_integration/paypal_express_uk.rb @@ -13,4 +13,7 @@ class Spree::BillingIntegration::PaypalExpressUk < Spree::BillingIntegration ActiveMerchant::Billing::PaypalExpressGateway end + def payment_profiles_supported? + !!preferred_review + end end diff --git a/spec/controllers/checkout_controller_spec.rb b/spec/controllers/checkout_controller_spec.rb index 16838d0..90d75a3 100644 --- a/spec/controllers/checkout_controller_spec.rb +++ b/spec/controllers/checkout_controller_spec.rb @@ -75,7 +75,10 @@ module Spree end context "paypal_confirm" do - before { PaymentMethod.should_receive(:find).at_least(1).with("123").and_return(paypal_gateway) } + before do + PaymentMethod.should_receive(:find).at_least(1).with("123").and_return(paypal_gateway) + order.stub!(:payment_method).and_return paypal_gateway + end context "with auto_capture and no review" do before do @@ -100,7 +103,10 @@ module Spree end context "with review" do - before { paypal_gateway.stub(:preferred_review => true) } + before do + paypal_gateway.stub(:preferred_review => true, :payment_profiles_supported? => true) + order.stub_chain(:payment, :payment_method, :payment_profiles_supported? => true) + end it "should render review" do paypal_gateway.provider.should_receive(:details_for).with(token).and_return(details_for_response) @@ -108,7 +114,15 @@ module Spree get :paypal_confirm, {:order_id => order.number, :payment_method_id => "123", :token => token, :PayerID => "FWRVKNRRZ3WUC" } response.should render_template("shared/paypal_express_confirm") - order.state.should == "payment" + order.state.should == "confirm" + end + + it "order state should not change on multiple call" do + paypal_gateway.provider.should_receive(:details_for).twice.with(token).and_return(details_for_response) + + get :paypal_confirm, {:order_id => order.number, :payment_method_id => "123", :token => token, :PayerID => "FWRVKNRRZ3WUC" } + get :paypal_confirm, {:order_id => order.number, :payment_method_id => "123", :token => token, :PayerID => "FWRVKNRRZ3WUC" } + order.state.should == "confirm" end end @@ -116,7 +130,8 @@ module Spree before do paypal_gateway.stub(:preferred_review => true) paypal_gateway.stub(:preferred_no_shipping => false) - + paypal_gateway.stub(:payment_profiles_supported? => true) + order.stub_chain(:payment, :payment_method, :payment_profiles_supported? => true) details_for_response.stub(:params => details_for_response.params.merge({'first_name' => 'Dr.', 'last_name' => 'Evil'}), :address => {'address1' => 'Apt. 187', 'address2'=> 'Some Str.', 'city' => 'Chevy Chase', 'country' => 'US', 'zip' => '20815', 'state' => 'MD' }) @@ -128,6 +143,7 @@ module Spree get :paypal_confirm, {:order_id => order.number, :payment_method_id => "123", :token => token, :PayerID => "FWRVKNRRZ3WUC" } order.ship_address.address1.should == "Apt. 187" + order.state.should == "confirm" response.should render_template("shared/paypal_express_confirm") end end diff --git a/spec/requests/paypal_express_spec.rb b/spec/requests/paypal_express_spec.rb index 0dc20dd..0d8c33c 100644 --- a/spec/requests/paypal_express_spec.rb +++ b/spec/requests/paypal_express_spec.rb @@ -26,15 +26,13 @@ feature "paypal express" do ['firstname', 'lastname', 'address1', 'city', 'zipcode', 'phone'].each do |field| fill_in "order_#{str_addr}_attributes_#{field}", :with => "#{address.send(field)}" end - save_and_open_page - select "#{address.state.name}", :from => "order_#{str_addr}_attributes_state_id" check "order_use_billing" click_button "Save and Continue" - choose "Paypal" pending + choose "Paypal" click_button "Save and Continue" end end \ No newline at end of file