require File.dirname(__FILE__) + '/../../test_helper' class PaypalTest < Test::Unit::TestCase def setup Base.mode = :test PaypalGateway.pem_file = nil @amount = 100 @gateway = PaypalGateway.new( :login => 'cody', :password => 'test', :pem => 'PEM' ) @credit_card = credit_card('4242424242424242') @options = { :billing_address => address, :ip => '127.0.0.1' } end def test_no_ip_address assert_raise(ArgumentError){ @gateway.purchase(@amount, @credit_card, :billing_address => address)} end def test_successful_purchase @gateway.expects(:ssl_post).returns(successful_purchase_response) assert response = @gateway.purchase(@amount, @credit_card, @options) assert_instance_of Response, response assert_success response assert_equal '62U664727W5914806', response.authorization assert response.test? end def test_failed_purchase @gateway.expects(:ssl_post).returns(failed_purchase_response) assert response = @gateway.purchase(@amount, @credit_card, @options) assert_instance_of Response, response assert_failure response assert response.test? end def test_reauthorization @gateway.expects(:ssl_post).returns(successful_reauthorization_response) response = @gateway.reauthorize(@amount, '32J876265E528623B') assert response.success? assert_equal('1TX27389GX108740X', response.authorization) assert response.test? end def test_reauthorization_with_warning @gateway.expects(:ssl_post).returns(successful_with_warning_reauthorization_response) response = @gateway.reauthorize(@amount, '32J876265E528623B') assert response.success? assert_equal('1TX27389GX108740X', response.authorization) assert response.test? end def test_amount_style assert_equal '10.34', @gateway.send(:amount, 1034) assert_raise(ArgumentError) do @gateway.send(:amount, '10.34') end end def test_paypal_timeout_error @gateway.stubs(:ssl_post).returns(paypal_timeout_error_response) response = @gateway.purchase(@amount, @credit_card, @options) assert_equal "SOAP-ENV:Server", response.params['faultcode'] assert_equal "Internal error", response.params['faultstring'] assert_equal "Timeout processing request", response.params['detail'] assert_equal "SOAP-ENV:Server: Internal error - Timeout processing request", response.message end def test_pem_file_accessor PaypalGateway.pem_file = '123456' gateway = PaypalGateway.new(:login => 'test', :password => 'test') assert_equal '123456', gateway.options[:pem] end def test_passed_in_pem_overrides_class_accessor PaypalGateway.pem_file = '123456' gateway = PaypalGateway.new(:login => 'test', :password => 'test', :pem => 'Clobber') assert_equal 'Clobber', gateway.options[:pem] end def test_ensure_options_are_transferred_to_express_instance PaypalGateway.pem_file = '123456' gateway = PaypalGateway.new(:login => 'test', :password => 'password') express = gateway.express assert_instance_of PaypalExpressGateway, express assert_equal 'test', express.options[:login] assert_equal 'password', express.options[:password] assert_equal '123456', express.options[:pem] end def test_supported_countries assert_equal ['US'], PaypalGateway.supported_countries end def test_supported_card_types assert_equal [:visa, :master, :american_express, :discover], PaypalGateway.supported_cardtypes end def test_button_source PaypalGateway.application_id = 'MerbMerchant_DC' xml = REXML::Document.new(@gateway.send(:build_sale_or_authorization_request, 'Test', @amount, @credit_card, {})) assert_equal 'MerbMerchant_DC', REXML::XPath.first(xml, '//n2:ButtonSource').text end def test_item_total_shipping_handling_and_tax_not_included_unless_all_are_present xml = @gateway.send(:build_sale_or_authorization_request, 'Authorization', @amount, @credit_card, :tax => @amount, :shipping => @amount, :handling => @amount ) doc = REXML::Document.new(xml) assert_nil REXML::XPath.first(doc, '//n2:PaymentDetails/n2:TaxTotal') end def test_item_total_shipping_handling_and_tax xml = @gateway.send(:build_sale_or_authorization_request, 'Authorization', @amount, @credit_card, :tax => @amount, :shipping => @amount, :handling => @amount, :subtotal => 200 ) doc = REXML::Document.new(xml) assert_equal '1.00', REXML::XPath.first(doc, '//n2:PaymentDetails/n2:TaxTotal').text end def test_should_use_test_certificate_endpoint gateway = PaypalGateway.new( :login => 'cody', :password => 'test', :pem => 'PEM' ) assert_equal PaypalGateway::URLS[:test][:certificate], gateway.send(:endpoint_url) end def test_should_use_live_certificate_endpoint gateway = PaypalGateway.new( :login => 'cody', :password => 'test', :pem => 'PEM' ) gateway.expects(:test?).returns(false) assert_equal PaypalGateway::URLS[:live][:certificate], gateway.send(:endpoint_url) end def test_should_use_test_signature_endpoint gateway = PaypalGateway.new( :login => 'cody', :password => 'test', :signature => 'SIG' ) assert_equal PaypalGateway::URLS[:test][:signature], gateway.send(:endpoint_url) end def test_should_use_live_signature_endpoint gateway = PaypalGateway.new( :login => 'cody', :password => 'test', :signature => 'SIG' ) gateway.expects(:test?).returns(false) assert_equal PaypalGateway::URLS[:live][:signature], gateway.send(:endpoint_url) end def test_should_raise_argument_when_credentials_not_present assert_raises(ArgumentError) do PaypalGateway.new(:login => 'cody', :password => 'test') end end def test_avs_result @gateway.expects(:ssl_post).returns(successful_purchase_response) response = @gateway.purchase(@amount, @credit_card, @options) assert_equal 'X', response.avs_result['code'] end def test_cvv_result @gateway.expects(:ssl_post).returns(successful_purchase_response) response = @gateway.purchase(@amount, @credit_card, @options) assert_equal 'M', response.cvv_result['code'] end def test_fraud_review @gateway.expects(:ssl_post).returns(fraud_review_response) response = @gateway.purchase(@amount, @credit_card, @options) assert_success response assert_equal "SuccessWithWarning", response.params["ack"] assert_equal "Payment Pending your review in Fraud Management Filters", response.message assert response.fraud_review? end def test_failed_capture_due_to_pending_fraud_review @gateway.expects(:ssl_post).returns(failed_capture_due_to_pending_fraud_review) response = @gateway.capture(@amount, 'authorization') assert_failure response assert_equal "Transaction must be accepted in Fraud Management Filters before capture.", response.message end # This occurs when sufficient 3rd party API permissions are not present to make the call for the user def test_authentication_failed_response @gateway.expects(:ssl_post).returns(authentication_failed_response) response = @gateway.purchase(@amount, @credit_card, @options) assert_failure response assert_equal "10002", response.params["error_codes"] assert_equal "You do not have permissions to make this API call", response.message end private def successful_purchase_response <<-RESPONSE 2008-01-06T23:41:25Z Success fee61882e6f47 2.000000 1.0006 3.00 X M 62U664727W5914806 RESPONSE end def failed_purchase_response <<-RESPONSE 2008-01-06T23:41:25Z Failure fee61882e6f47 2.000000 1.0006 3.00 X M RESPONSE end def paypal_timeout_error_response <<-RESPONSE SOAP-ENV:Server Internal error Timeout processing request RESPONSE end def successful_reauthorization_response <<-RESPONSE 2007-03-04T23:34:42Z Success e444ddb7b3ed9 2.000000 1.0006 1TX27389GX108740X RESPONSE end def successful_with_warning_reauthorization_response <<-RESPONSE 2007-03-04T23:34:42Z SuccessWithWarning e444ddb7b3ed9 2.000000 1.0006 1TX27389GX108740X RESPONSE end def fraud_review_response <<-RESPONSE An5ns1Kso7MWUdW4ErQKJJJ4qi4-Azffuo82oMt-Cv9I8QTOs-lG5sAv 2008-07-04T19:27:39Z SuccessWithWarning 205d8397e7ed Payment Pending your review in Fraud Management Filters Payment Pending your review in Fraud Management Filters 11610 Warning 50.0 623197 1500.00 X M 5V117995ER6796022 RESPONSE end def failed_capture_due_to_pending_fraud_review <<-RESPONSE 2008-07-04T21:45:35Z Failure 32a3855bd35b7 Transaction must be accepted in Fraud Management Filters before capture. 11612 Error 52.000000 588340 none none None none none RESPONSE end def authentication_failed_response <<-RESPONSE 2008-08-12T19:40:59Z Failure b874109bfd11 Authentication/Authorization Failed You do not have permissions to make this API call 10002 Error 52.000000 628921 RESPONSE end end