paypal-express 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +22 -0
- data/.rspec +2 -0
- data/Gemfile +2 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +20 -0
- data/VERSION +1 -0
- data/lib/cert +3509 -0
- data/lib/paypal.rb +56 -0
- data/lib/paypal/base.rb +19 -0
- data/lib/paypal/exceptions.rb +21 -0
- data/lib/paypal/express.rb +1 -0
- data/lib/paypal/express/request.rb +64 -0
- data/lib/paypal/express/response.rb +19 -0
- data/lib/paypal/nvp/request.rb +59 -0
- data/lib/paypal/nvp/response.rb +145 -0
- data/lib/paypal/payment/recurring.rb +43 -0
- data/lib/paypal/payment/recurring/activation.rb +14 -0
- data/lib/paypal/payment/recurring/billing.rb +37 -0
- data/lib/paypal/payment/recurring/summary.rb +11 -0
- data/lib/paypal/payment/request.rb +24 -0
- data/lib/paypal/payment/response.rb +36 -0
- data/lib/paypal/payment/response/amount.rb +11 -0
- data/lib/paypal/payment/response/info.rb +40 -0
- data/lib/paypal/payment/response/payer.rb +7 -0
- data/lib/paypal/payment/response/ship_to.rb +7 -0
- data/lib/paypal/util.rb +28 -0
- data/lib/restclient_with_ssl_support.rb +16 -0
- data/paypal-express.gemspec +24 -0
- data/spec/fake_response/CreateRecurringPaymentsProfile/failure.txt +1 -0
- data/spec/fake_response/CreateRecurringPaymentsProfile/success.txt +1 -0
- data/spec/fake_response/DoExpressCheckoutPayment/failure.txt +1 -0
- data/spec/fake_response/DoExpressCheckoutPayment/success.txt +1 -0
- data/spec/fake_response/GetExpressCheckoutDetails/failure.txt +1 -0
- data/spec/fake_response/GetExpressCheckoutDetails/success.txt +1 -0
- data/spec/fake_response/GetRecurringPaymentsProfileDetails/failure.txt +1 -0
- data/spec/fake_response/GetRecurringPaymentsProfileDetails/success.txt +1 -0
- data/spec/fake_response/ManageRecurringPaymentsProfileStatus/failure.txt +1 -0
- data/spec/fake_response/ManageRecurringPaymentsProfileStatus/success.txt +1 -0
- data/spec/fake_response/SetExpressCheckout/failure.txt +1 -0
- data/spec/fake_response/SetExpressCheckout/success.txt +1 -0
- data/spec/helpers/fake_response_helper.rb +27 -0
- data/spec/paypal/exception_spec.rb +17 -0
- data/spec/paypal/express/request_spec.rb +223 -0
- data/spec/paypal/express/response_spec.rb +33 -0
- data/spec/paypal/nvp/request_spec.rb +88 -0
- data/spec/paypal/payment/recurring_spec.rb +114 -0
- data/spec/paypal/payment/request_spec.rb +55 -0
- data/spec/paypal/payment/response/amount_spec.rb +36 -0
- data/spec/paypal/payment/response/info_spec.rb +88 -0
- data/spec/paypal/payment/response/payer_spec.rb +26 -0
- data/spec/paypal/payment/response/ship_to_spec.rb +26 -0
- data/spec/paypal/util_spec.rb +32 -0
- data/spec/spec_helper.rb +22 -0
- metadata +267 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe Paypal::Express::Response do
|
4
|
+
before do
|
5
|
+
fake_response 'SetExpressCheckout/success'
|
6
|
+
end
|
7
|
+
|
8
|
+
let :instance do
|
9
|
+
request = Paypal::Express::Request.new(
|
10
|
+
:username => 'nov',
|
11
|
+
:password => 'password',
|
12
|
+
:signature => 'sig',
|
13
|
+
:return_url => 'http://example.com/success',
|
14
|
+
:cancel_url => 'http://example.com/cancel'
|
15
|
+
)
|
16
|
+
request.setup Paypal::Payment::Request.new(
|
17
|
+
:billing_type => :RecurringPayments,
|
18
|
+
:billing_agreement_description => 'Recurring Payment Request'
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#redirect_uri' do
|
23
|
+
it 'should return express-checkout redirect endpoint with token' do
|
24
|
+
instance.redirect_uri.should == 'https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-5YJ90598G69065317'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should support sandbox mode' do
|
28
|
+
sandbox_mode do
|
29
|
+
instance.redirect_uri.should == 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-5YJ90598G69065317'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe Paypal::NVP::Request do
|
4
|
+
let :attributes do
|
5
|
+
{
|
6
|
+
:username => 'nov',
|
7
|
+
:password => 'password',
|
8
|
+
:signature => 'sig'
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
let :instance do
|
13
|
+
Paypal::NVP::Request.new attributes
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.new' do
|
17
|
+
context 'when any required parameters are missing' do
|
18
|
+
it 'should raise AttrMissing exception' do
|
19
|
+
attributes.keys.each do |missing_key|
|
20
|
+
insufficient_attributes = attributes.reject do |key, value|
|
21
|
+
key == missing_key
|
22
|
+
end
|
23
|
+
lambda do
|
24
|
+
Paypal::NVP::Request.new insufficient_attributes
|
25
|
+
end.should raise_error AttrRequired::AttrMissing
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'when all required parameters are given' do
|
31
|
+
it 'should succeed' do
|
32
|
+
lambda do
|
33
|
+
Paypal::NVP::Request.new attributes
|
34
|
+
end.should_not raise_error AttrRequired::AttrMissing
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should setup endpoint and version' do
|
38
|
+
client = Paypal::NVP::Request.new attributes
|
39
|
+
client.version.should == Paypal::API_VERSION
|
40
|
+
client.endpoint.should == Paypal::NVP::Request::ENDPOINT[:production]
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should support sandbox mode' do
|
44
|
+
sandbox_mode do
|
45
|
+
client = Paypal::NVP::Request.new attributes
|
46
|
+
client.endpoint.should == Paypal::NVP::Request::ENDPOINT[:sandbox]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#request' do
|
53
|
+
it 'should POST to NPV endpoint' do
|
54
|
+
lambda do
|
55
|
+
instance.request :RPCMethod
|
56
|
+
end.should request_to Paypal::NVP::Request::ENDPOINT[:production], :post
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when got API error response' do
|
60
|
+
before do
|
61
|
+
fake_response 'SetExpressCheckout/failure'
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should raise Paypal::APIError' do
|
65
|
+
lambda do
|
66
|
+
instance.request :SetExpressCheckout
|
67
|
+
end.should raise_error(Paypal::APIError)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when got HTTP error response' do
|
72
|
+
before do
|
73
|
+
FakeWeb.register_uri(
|
74
|
+
:post,
|
75
|
+
Paypal::NVP::Request::ENDPOINT[:production],
|
76
|
+
:body => "Invalid Request",
|
77
|
+
:status => ["400", "Bad Request"]
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should raise Paypal::APIError' do
|
82
|
+
lambda do
|
83
|
+
instance.request :SetExpressCheckout
|
84
|
+
end.should raise_error(Paypal::HttpError)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe Paypal::Payment::Recurring do
|
4
|
+
let :keys do
|
5
|
+
Paypal::Payment::Recurring.optional_attributes
|
6
|
+
end
|
7
|
+
|
8
|
+
let :attributes do
|
9
|
+
{
|
10
|
+
:identifier => '12345',
|
11
|
+
:description => 'Subscription Payment Profile',
|
12
|
+
:status => 'Active',
|
13
|
+
:start_date => '2011-02-03T15:00:00Z',
|
14
|
+
:name => 'Nov Matake',
|
15
|
+
:auto_bill => 'NoAutoBill',
|
16
|
+
:max_fails => '0',
|
17
|
+
:aggregate_amount => '1000',
|
18
|
+
:aggregate_optional_amount => '0',
|
19
|
+
:final_payment_date => '1970-01-01T00:00:00Z',
|
20
|
+
:billing => {
|
21
|
+
:amount => Paypal::Payment::Response::Amount.new(
|
22
|
+
:total => '1000',
|
23
|
+
:shipping => '0',
|
24
|
+
:tax => '0'
|
25
|
+
),
|
26
|
+
:currency_code => 'JPY',
|
27
|
+
:period => 'Month',
|
28
|
+
:frequency => '1',
|
29
|
+
:total_cycles => '0',
|
30
|
+
:trial_amount_paid => '0'
|
31
|
+
},
|
32
|
+
:regular_billing => {
|
33
|
+
:amount => '1000',
|
34
|
+
:shipping_amount => '0',
|
35
|
+
:tax_amount => '0',
|
36
|
+
:currency_code => 'JPY',
|
37
|
+
:period => 'Month',
|
38
|
+
:frequency => '1',
|
39
|
+
:total_cycles => '0',
|
40
|
+
:paid => '1000'
|
41
|
+
},
|
42
|
+
:summary => {
|
43
|
+
:next_billing_date => '2011-03-04T10:00:00Z',
|
44
|
+
:cycles_completed => '1',
|
45
|
+
:cycles_remaining => '18446744073709551615',
|
46
|
+
:outstanding_balance => '0',
|
47
|
+
:failed_count => '0',
|
48
|
+
:last_payment_date => '2011-02-04T10:50:56Z',
|
49
|
+
:last_payment_amount => '1000'
|
50
|
+
}
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
let :instance do
|
55
|
+
Paypal::Payment::Recurring.new attributes
|
56
|
+
end
|
57
|
+
|
58
|
+
describe '.new' do
|
59
|
+
it 'should accept all supported attributes' do
|
60
|
+
instance.identifier.should == '12345'
|
61
|
+
instance.description.should == 'Subscription Payment Profile'
|
62
|
+
instance.status.should == 'Active'
|
63
|
+
instance.start_date.should == '2011-02-03T15:00:00Z'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#to_params' do
|
68
|
+
it 'should handle Recurring Profile parameters' do
|
69
|
+
instance.to_params.should == {
|
70
|
+
:AUTOBILLAMT => 'NoAutoBill',
|
71
|
+
:BILLINGFREQUENCY => 1,
|
72
|
+
:TRIALTOTALBILLINGCYCLES => 0,
|
73
|
+
:SHIPPINGAMT => '0.00',
|
74
|
+
:DESC => 'Subscription Payment Profile',
|
75
|
+
:SUBSCRIBERNAME => 'Nov Matake',
|
76
|
+
:BILLINGPERIOD => 'Month',
|
77
|
+
:AMT => '1000.00',
|
78
|
+
:MAXFAILEDPAYMENTS => 0,
|
79
|
+
:TOTALBILLINGCYCLES => 0,
|
80
|
+
:TRIALBILLINGFREQUENCY => 0,
|
81
|
+
:TAXAMT => '0.00',
|
82
|
+
:TRIALAMT => '0.00',
|
83
|
+
:PROFILESTARTDATE => '2011-02-03T15:00:00Z',
|
84
|
+
:CURRENCYCODE => 'JPY'
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'when start_date is Time' do
|
89
|
+
it 'should be stringfy' do
|
90
|
+
instance = Paypal::Payment::Recurring.new attributes.merge(
|
91
|
+
:start_date => Time.utc(2011, 2, 8, 15, 0, 0)
|
92
|
+
)
|
93
|
+
instance.start_date.should be_instance_of(Time)
|
94
|
+
instance.to_params[:PROFILESTARTDATE].should == '2011-02-08 15:00:00'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '#numeric_attribute?' do
|
100
|
+
let :numeric_attributes do
|
101
|
+
[:aggregate_amount, :aggregate_optional_amount, :max_fails, :failed_count]
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should detect numeric attributes' do
|
105
|
+
numeric_attributes.each do |key|
|
106
|
+
instance.numeric_attribute?(key).should be_true
|
107
|
+
end
|
108
|
+
non_numeric_keys = keys - numeric_attributes
|
109
|
+
non_numeric_keys.each do |key|
|
110
|
+
instance.numeric_attribute?(key).should be_false
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe Paypal::Payment::Request do
|
4
|
+
let :instant_request do
|
5
|
+
Paypal::Payment::Request.new(
|
6
|
+
:amount => 10,
|
7
|
+
:currency_code => :JPY,
|
8
|
+
:description => 'Instant Payment Request',
|
9
|
+
:notify_url => 'http://merchant.example.com/notify'
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
let :recurring_request do
|
14
|
+
Paypal::Payment::Request.new(
|
15
|
+
:currency_code => :JPY,
|
16
|
+
:billing_type => :RecurringPayments,
|
17
|
+
:billing_agreement_description => 'Recurring Payment Request'
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '.new' do
|
22
|
+
it 'should handle Instant Payment parameters' do
|
23
|
+
instant_request.amount.should == 10
|
24
|
+
instant_request.currency_code.should == :JPY
|
25
|
+
instant_request.description.should == 'Instant Payment Request'
|
26
|
+
instant_request.notify_url.should == 'http://merchant.example.com/notify'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should handle Recurring Payment parameters' do
|
30
|
+
recurring_request.currency_code.should == :JPY
|
31
|
+
recurring_request.billing_type.should == :RecurringPayments
|
32
|
+
recurring_request.billing_agreement_description.should == 'Recurring Payment Request'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#to_params' do
|
37
|
+
it 'should handle Instant Payment parameters' do
|
38
|
+
instant_request.to_params.should == {
|
39
|
+
:PAYMENTREQUEST_0_AMT => "10.00",
|
40
|
+
:PAYMENTREQUEST_0_CURRENCYCODE => :JPY,
|
41
|
+
:PAYMENTREQUEST_0_DESC => "Instant Payment Request",
|
42
|
+
:PAYMENTREQUEST_0_NOTIFYURL => "http://merchant.example.com/notify"
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should handle Recurring Payment parameters' do
|
47
|
+
recurring_request.to_params.should == {
|
48
|
+
:PAYMENTREQUEST_0_AMT => "0.00",
|
49
|
+
:PAYMENTREQUEST_0_CURRENCYCODE => :JPY,
|
50
|
+
:L_BILLINGTYPE0 => :RecurringPayments,
|
51
|
+
:L_BILLINGAGREEMENTDESCRIPTION0 => "Recurring Payment Request"
|
52
|
+
}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe Paypal::Payment::Response::Amount do
|
4
|
+
let :keys do
|
5
|
+
Paypal::Payment::Response::Amount.optional_attributes
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.new' do
|
9
|
+
it 'should not allow nil for attributes' do
|
10
|
+
amount = Paypal::Payment::Response::Amount.new
|
11
|
+
keys.each do |key|
|
12
|
+
amount.send(key).should == 0
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should treat all attributes as Numeric' do
|
17
|
+
# Integer
|
18
|
+
attributes = keys.inject({}) do |attributes, key|
|
19
|
+
attributes.merge!(key => "100")
|
20
|
+
end
|
21
|
+
amount = Paypal::Payment::Response::Amount.new attributes
|
22
|
+
keys.each do |key|
|
23
|
+
amount.send(key).should == 100
|
24
|
+
end
|
25
|
+
|
26
|
+
# Float
|
27
|
+
attributes = keys.inject({}) do |attributes, key|
|
28
|
+
attributes.merge!(key => "10.25")
|
29
|
+
end
|
30
|
+
amount = Paypal::Payment::Response::Amount.new attributes
|
31
|
+
keys.each do |key|
|
32
|
+
amount.send(key).should == 10.25
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe Paypal::Payment::Response::Info do
|
4
|
+
let :attribute_mapping do
|
5
|
+
Paypal::Payment::Response::Info.attribute_mapping
|
6
|
+
end
|
7
|
+
|
8
|
+
let :attributes do
|
9
|
+
{
|
10
|
+
:ACK => 'Success',
|
11
|
+
:CURRENCYCODE => 'JPY',
|
12
|
+
:ERRORCODE => 0,
|
13
|
+
:ORDERTIME => '2011-02-08T03:23:54Z',
|
14
|
+
:PAYMENTSTATUS => 'Completed',
|
15
|
+
:PAYMENTTYPE => 'instant',
|
16
|
+
:PENDINGREASON => 'None',
|
17
|
+
:PROTECTIONELIGIBILITY => 'Ineligible',
|
18
|
+
:PROTECTIONELIGIBILITYTYPE => 'None',
|
19
|
+
:REASONCODE => 'None',
|
20
|
+
:TRANSACTIONID => '8NC65222871997739',
|
21
|
+
:TRANSACTIONTYPE => 'expresscheckout',
|
22
|
+
:AMT => '14.00',
|
23
|
+
:FEEAMT => '0.85',
|
24
|
+
:TAXAMT => '0.00'
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '.new' do
|
29
|
+
context 'when attribute keys are uppercase Symbol' do
|
30
|
+
it 'should accept all without any warning' do
|
31
|
+
Paypal.logger.should_not_receive(:warn)
|
32
|
+
from_symbol_uppercase = Paypal::Payment::Response::Info.new attributes
|
33
|
+
attribute_mapping.values.each do |key|
|
34
|
+
from_symbol_uppercase.send(key).should_not be_nil
|
35
|
+
end
|
36
|
+
from_symbol_uppercase.amount.should == Paypal::Payment::Response::Amount.new(
|
37
|
+
:total => 14,
|
38
|
+
:fee => 0.85
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when attribute keys are lowercase Symbol' do
|
44
|
+
it 'should ignore them and warn' do
|
45
|
+
_attrs_ = attributes.inject({}) do |_attrs_, (k, v)|
|
46
|
+
_attrs_.merge!(k.to_s.downcase.to_sym => v)
|
47
|
+
end
|
48
|
+
_attrs_.each do |key, value|
|
49
|
+
Paypal.logger.should_receive(:warn).with(
|
50
|
+
"Ignored Parameter (Paypal::Payment::Response::Info): #{key}=#{value}"
|
51
|
+
)
|
52
|
+
end
|
53
|
+
from_symbol_lowercase = Paypal::Payment::Response::Info.new _attrs_
|
54
|
+
attribute_mapping.values.each do |key|
|
55
|
+
from_symbol_lowercase.send(key).should be_nil
|
56
|
+
end
|
57
|
+
from_symbol_lowercase.amount.should == Paypal::Payment::Response::Amount.new
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when attribute keys are String' do
|
62
|
+
it 'should ignore them and warn' do
|
63
|
+
attributes.stringify_keys.each do |key, value|
|
64
|
+
Paypal.logger.should_receive(:warn).with(
|
65
|
+
"Ignored Parameter (Paypal::Payment::Response::Info): #{key}=#{value}"
|
66
|
+
)
|
67
|
+
end
|
68
|
+
from_string = Paypal::Payment::Response::Info.new attributes.stringify_keys
|
69
|
+
attribute_mapping.values.each do |key|
|
70
|
+
from_string.send(key).should be_nil
|
71
|
+
end
|
72
|
+
from_string.amount.should == Paypal::Payment::Response::Amount.new
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'when non-supported attributes are given' do
|
77
|
+
it 'should ignore them and warn' do
|
78
|
+
_attr_ = attributes.merge(
|
79
|
+
:ignored => 'Ignore me!'
|
80
|
+
)
|
81
|
+
Paypal.logger.should_receive(:warn).with(
|
82
|
+
"Ignored Parameter (Paypal::Payment::Response::Info): ignored=Ignore me!"
|
83
|
+
)
|
84
|
+
Paypal::Payment::Response::Info.new _attr_
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe Paypal::Payment::Response::Payer do
|
4
|
+
let :keys do
|
5
|
+
Paypal::Payment::Response::Payer.optional_attributes
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.new' do
|
9
|
+
it 'should allow nil for attributes' do
|
10
|
+
payer = Paypal::Payment::Response::Payer.new
|
11
|
+
keys.each do |key|
|
12
|
+
payer.send(key).should be_nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should treat all attributes as String' do
|
17
|
+
attributes = keys.inject({}) do |attributes, key|
|
18
|
+
attributes.merge!(key => "xyz")
|
19
|
+
end
|
20
|
+
payer = Paypal::Payment::Response::Payer.new attributes
|
21
|
+
keys.each do |key|
|
22
|
+
payer.send(key).should == "xyz"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|