require 'test_helper' class PaypalExpressTest < Test::Unit::TestCase TEST_REDIRECT_URL = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=1234567890' LIVE_REDIRECT_URL = 'https://www.paypal.com/cgibin/webscr?cmd=_express-checkout&token=1234567890' TEST_REDIRECT_URL_WITHOUT_REVIEW = "#{TEST_REDIRECT_URL}&useraction=commit" LIVE_REDIRECT_URL_WITHOUT_REVIEW = "#{LIVE_REDIRECT_URL}&useraction=commit" def setup @gateway = PaypalExpressGateway.new( :login => 'cody', :password => 'test', :pem => 'PEM' ) @address = { :address1 => '1234 My Street', :address2 => 'Apt 1', :company => 'Widgets Inc', :city => 'Ottawa', :state => 'ON', :zip => 'K1C2N6', :country => 'Canada', :phone => '(555)555-5555' } Base.gateway_mode = :test end def teardown Base.gateway_mode = :test end def test_live_redirect_url Base.gateway_mode = :production assert_equal LIVE_REDIRECT_URL, @gateway.redirect_url_for('1234567890') end def test_live_redirect_url_without_review Base.gateway_mode = :production assert_equal LIVE_REDIRECT_URL_WITHOUT_REVIEW, @gateway.redirect_url_for('1234567890', :review => false) end def test_force_sandbox_redirect_url Base.gateway_mode = :production gateway = PaypalExpressGateway.new( :login => 'cody', :password => 'test', :pem => 'PEM', :test => true ) assert gateway.test? assert_equal TEST_REDIRECT_URL, gateway.redirect_url_for('1234567890') end def test_test_redirect_url assert_equal :test, Base.gateway_mode assert_equal TEST_REDIRECT_URL, @gateway.redirect_url_for('1234567890') end def test_test_redirect_url_without_review assert_equal :test, Base.gateway_mode assert_equal TEST_REDIRECT_URL_WITHOUT_REVIEW, @gateway.redirect_url_for('1234567890', :review => false) end def test_get_express_details @gateway.expects(:ssl_post).returns(successful_details_response) response = @gateway.details_for('EC-2OPN7UJGFWK9OYFV') assert_instance_of PaypalExpressResponse, response assert response.success? assert response.test? assert_equal 'EC-6WS104951Y388951L', response.token assert_equal 'FWRVKNRRZ3WUC', response.payer_id assert_equal 'buyer@jadedpallet.com', response.email assert address = response.address assert_equal 'Fred Brooks', address['name'] assert_nil address['company'] assert_equal '1234 Penny Lane', address['address1'] assert_nil address['address2'] assert_equal 'Jonsetown', address['city'] assert_equal 'NC', address['state'] assert_equal '23456', address['zip'] assert_equal 'US', address['country'] assert_nil address['phone'] end def test_authorization @gateway.expects(:ssl_post).returns(successful_authorization_response) response = @gateway.authorize(300, :token => 'EC-6WS104951Y388951L', :payer_id => 'FWRVKNRRZ3WUC') assert response.success? assert_not_nil response.authorization assert response.test? end def test_default_payflow_currency assert_equal 'USD', PayflowExpressGateway.default_currency end def test_default_partner assert_equal 'PayPal', PayflowExpressGateway.partner end def test_uk_partner assert_equal 'PayPalUk', PayflowExpressUkGateway.partner end def test_handle_non_zero_amount xml = REXML::Document.new(@gateway.send(:build_setup_request, 'SetExpressCheckout', 50, {})) assert_equal '0.50', REXML::XPath.first(xml, '//n2:OrderTotal').text end def test_handles_zero_amount xml = REXML::Document.new(@gateway.send(:build_setup_request, 'SetExpressCheckout', 0, {})) assert_equal '1.00', REXML::XPath.first(xml, '//n2:OrderTotal').text end def test_handle_locale_code xml = REXML::Document.new(@gateway.send(:build_setup_request, 'SetExpressCheckout', 0, { :locale => 'GB' })) assert_equal 'GB', REXML::XPath.first(xml, '//n2:LocaleCode').text end def test_supported_countries assert_equal ['US'], PaypalExpressGateway.supported_countries end def test_button_source PaypalExpressGateway.application_id = 'AbtainBilling_EC' xml = REXML::Document.new(@gateway.send(:build_sale_or_authorization_request, 'Test', 100, {})) assert_equal 'AbtainBilling_EC', REXML::XPath.first(xml, '//n2:ButtonSource').text end def test_error_code_for_single_error @gateway.expects(:ssl_post).returns(response_with_error) response = @gateway.setup_authorization(100, :return_url => 'http://example.com', :cancel_return_url => 'http://example.com' ) assert_equal "10736", response.params['error_codes'] end def test_ensure_only_unique_error_codes @gateway.expects(:ssl_post).returns(response_with_duplicate_errors) response = @gateway.setup_authorization(100, :return_url => 'http://example.com', :cancel_return_url => 'http://example.com' ) assert_equal "10736" , response.params['error_codes'] end def test_error_codes_for_multiple_errors @gateway.expects(:ssl_post).returns(response_with_errors) response = @gateway.setup_authorization(100, :return_url => 'http://example.com', :cancel_return_url => 'http://example.com' ) assert_equal ["10736", "10002"] , response.params['error_codes'].split(',') end private def successful_details_response <<-RESPONSE 2007-02-12T23:59:43Z Success c73044f11da65 2.000000 1.0006 EC-6WS104951Y388951L buyer@jadedpallet.com FWRVKNRRZ3WUC verified Fred Brooks US
Fred Brooks 1234 Penny Lane Jonsetown NC US United States 23456 PayPal Confirmed
1230123
RESPONSE end def successful_authorization_response <<-RESPONSE 2007-02-13T00:18:50Z Success 62450a4266d04 2.000000 1.0006 EC-6WS104951Y388951L 8B266858CH956410C express-checkout instant 2007-02-13T00:18:48Z 3.00 0.00 Pending authorization none RESPONSE end def response_with_error <<-RESPONSE 2008-04-02T17:38:02Z Failure cdb720feada30 Shipping Address Invalid City State Postal Code A match of the Shipping Address City, State, and Postal Code failed. 10736 Error 2.000000 543066 RESPONSE end def response_with_errors <<-RESPONSE 2008-04-02T17:38:02Z Failure cdb720feada30 Shipping Address Invalid City State Postal Code A match of the Shipping Address City, State, and Postal Code failed. 10736 Error Authentication/Authorization Failed You do not have permissions to make this API call 10002 Error 2.000000 543066 RESPONSE end def response_with_duplicate_errors <<-RESPONSE 2008-04-02T17:38:02Z Failure cdb720feada30 Shipping Address Invalid City State Postal Code A match of the Shipping Address City, State, and Postal Code failed. 10736 Error Shipping Address Invalid City State Postal Code A match of the Shipping Address City, State, and Postal Code failed. 10736 Error 2.000000 543066 RESPONSE end end