creative-paypal-express 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.gitignore +22 -0
- data/.rspec +2 -0
- data/.travis.yml +6 -0
- data/Gemfile +7 -0
- data/LICENSE +20 -0
- data/README.rdoc +34 -0
- data/Rakefile +19 -0
- data/VERSION +1 -0
- data/lib/paypal.rb +84 -0
- data/lib/paypal/base.rb +19 -0
- data/lib/paypal/exception.rb +4 -0
- data/lib/paypal/exception/api_error.rb +94 -0
- data/lib/paypal/exception/http_error.rb +12 -0
- data/lib/paypal/express.rb +1 -0
- data/lib/paypal/express/request.rb +195 -0
- data/lib/paypal/express/response.rb +35 -0
- data/lib/paypal/ipn.rb +23 -0
- data/lib/paypal/nvp/request.rb +64 -0
- data/lib/paypal/nvp/response.rb +233 -0
- data/lib/paypal/payment/common/amount.rb +13 -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 +39 -0
- data/lib/paypal/payment/recurring/summary.rb +11 -0
- data/lib/paypal/payment/request.rb +67 -0
- data/lib/paypal/payment/request/item.rb +26 -0
- data/lib/paypal/payment/response.rb +73 -0
- data/lib/paypal/payment/response/address.rb +7 -0
- data/lib/paypal/payment/response/info.rb +45 -0
- data/lib/paypal/payment/response/item.rb +41 -0
- data/lib/paypal/payment/response/payer.rb +7 -0
- data/lib/paypal/payment/response/reference.rb +9 -0
- data/lib/paypal/payment/response/refund.rb +13 -0
- data/lib/paypal/util.rb +28 -0
- data/paypal-express.gemspec +23 -0
- data/spec/fake_response/BillAgreementUpdate/fetch.txt +1 -0
- data/spec/fake_response/BillAgreementUpdate/revoke.txt +1 -0
- data/spec/fake_response/CreateBillingAgreement/success.txt +1 -0
- data/spec/fake_response/CreateRecurringPaymentsProfile/failure.txt +1 -0
- data/spec/fake_response/CreateRecurringPaymentsProfile/success.txt +1 -0
- data/spec/fake_response/DoCapture/failure.txt +1 -0
- data/spec/fake_response/DoCapture/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/DoExpressCheckoutPayment/success_with_billing_agreement.txt +1 -0
- data/spec/fake_response/DoExpressCheckoutPayment/success_with_many_items.txt +1 -0
- data/spec/fake_response/DoReferenceTransaction/failure.txt +1 -0
- data/spec/fake_response/DoReferenceTransaction/success.txt +1 -0
- data/spec/fake_response/DoVoid/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/GetExpressCheckoutDetails/with_billing_accepted_status.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/GetTransactionDetails/failure.txt +1 -0
- data/spec/fake_response/GetTransactionDetails/success.txt +1 -0
- data/spec/fake_response/IPN/invalid.txt +1 -0
- data/spec/fake_response/IPN/valid.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/RefundTransaction/full.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 +33 -0
- data/spec/paypal/exception/api_error_spec.rb +78 -0
- data/spec/paypal/exception/http_error_spec.rb +8 -0
- data/spec/paypal/express/request_spec.rb +584 -0
- data/spec/paypal/express/response_spec.rb +80 -0
- data/spec/paypal/ipn_spec.rb +19 -0
- data/spec/paypal/nvp/request_spec.rb +116 -0
- data/spec/paypal/nvp/response_spec.rb +146 -0
- data/spec/paypal/payment/common/amount_spec.rb +36 -0
- data/spec/paypal/payment/recurring/activation_spec.rb +19 -0
- data/spec/paypal/payment/recurring_spec.rb +170 -0
- data/spec/paypal/payment/request/item_spec.rb +27 -0
- data/spec/paypal/payment/request_spec.rb +136 -0
- data/spec/paypal/payment/response/address_spec.rb +26 -0
- data/spec/paypal/payment/response/info_spec.rb +93 -0
- data/spec/paypal/payment/response/item_spec.rb +42 -0
- data/spec/paypal/payment/response/payer_spec.rb +26 -0
- data/spec/paypal/payment/response_spec.rb +16 -0
- data/spec/paypal/util_spec.rb +32 -0
- data/spec/spec_helper.rb +25 -0
- metadata +278 -0
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe Paypal::Express::Response do
|
4
|
+
before { fake_response 'SetExpressCheckout/success' }
|
5
|
+
|
6
|
+
let(:return_url) { 'http://example.com/success' }
|
7
|
+
let(:cancel_url) { 'http://example.com/cancel' }
|
8
|
+
let :request do
|
9
|
+
Paypal::Express::Request.new(
|
10
|
+
:username => 'nov',
|
11
|
+
:password => 'password',
|
12
|
+
:signature => 'sig'
|
13
|
+
)
|
14
|
+
end
|
15
|
+
let :payment_request do
|
16
|
+
Paypal::Payment::Request.new(
|
17
|
+
:billing_type => :RecurringPayments,
|
18
|
+
:billing_agreement_description => 'Recurring Payment Request'
|
19
|
+
)
|
20
|
+
end
|
21
|
+
let(:response) { request.setup payment_request, return_url, cancel_url }
|
22
|
+
|
23
|
+
describe '#redirect_uri' do
|
24
|
+
subject { response.redirect_uri }
|
25
|
+
it { should include 'https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=' }
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#popup_uri' do
|
29
|
+
subject { response.popup_uri }
|
30
|
+
it { should include 'https://www.paypal.com/incontext?token=' }
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when pay_on_paypal option is given' do
|
34
|
+
let(:response) { request.setup payment_request, return_url, cancel_url, :pay_on_paypal => true }
|
35
|
+
|
36
|
+
subject { response }
|
37
|
+
its(:pay_on_paypal) { should be_true }
|
38
|
+
its(:query) { should include(:useraction => 'commit') }
|
39
|
+
|
40
|
+
describe '#redirect_uri' do
|
41
|
+
subject { response.redirect_uri }
|
42
|
+
it { should include 'useraction=commit' }
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#popup_uri' do
|
46
|
+
subject { response.popup_uri }
|
47
|
+
it { should include 'useraction=commit' }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when sandbox mode' do
|
52
|
+
before do
|
53
|
+
Paypal.sandbox!
|
54
|
+
fake_response 'SetExpressCheckout/success'
|
55
|
+
end
|
56
|
+
after { Paypal.sandbox = false }
|
57
|
+
|
58
|
+
describe '#redirect_uri' do
|
59
|
+
subject { response.redirect_uri }
|
60
|
+
it { should include 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=' }
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#popup_uri' do
|
64
|
+
subject { response.popup_uri }
|
65
|
+
it { should include 'https://www.sandbox.paypal.com/incontext?token=' }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'when mobile option is given' do
|
70
|
+
let(:response) { request.setup payment_request, return_url, cancel_url, :mobile => true }
|
71
|
+
|
72
|
+
subject { response }
|
73
|
+
|
74
|
+
describe '#redirect_uri' do
|
75
|
+
subject { response.redirect_uri }
|
76
|
+
it { should include 'https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout-mobile&token=' }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Paypal::IPN do
|
4
|
+
describe '.verify!' do
|
5
|
+
context 'when valid' do
|
6
|
+
before { fake_response 'IPN/valid', :IPN }
|
7
|
+
subject { Paypal::IPN.verify!('raw-post-body') }
|
8
|
+
it { should be_true }
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'when invalid' do
|
12
|
+
before { fake_response 'IPN/invalid', :IPN }
|
13
|
+
subject {}
|
14
|
+
it do
|
15
|
+
expect { Paypal::IPN.verify!('raw-post-body') }.to raise_error(Paypal::Exception::APIError)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,116 @@
|
|
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 AttrRequired::AttrMissing' do
|
19
|
+
attributes.keys.each do |missing_key|
|
20
|
+
insufficient_attributes = attributes.reject do |key, value|
|
21
|
+
key == missing_key
|
22
|
+
end
|
23
|
+
expect do
|
24
|
+
Paypal::NVP::Request.new insufficient_attributes
|
25
|
+
end.to 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
|
+
expect do
|
33
|
+
Paypal::NVP::Request.new attributes
|
34
|
+
end.not_to raise_error AttrRequired::AttrMissing
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should setup endpoint and version' do
|
38
|
+
client = Paypal::NVP::Request.new attributes
|
39
|
+
client.class.endpoint.should == Paypal::NVP::Request::ENDPOINT[:production]
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should support sandbox mode' do
|
43
|
+
sandbox_mode do
|
44
|
+
client = Paypal::NVP::Request.new attributes
|
45
|
+
client.class.endpoint.should == Paypal::NVP::Request::ENDPOINT[:sandbox]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when optional parameters are given' do
|
51
|
+
let(:optional_attributes) do
|
52
|
+
{ :subject => 'user@example.com' }
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should setup subject' do
|
56
|
+
client = Paypal::NVP::Request.new attributes.merge(optional_attributes)
|
57
|
+
client.subject.should == 'user@example.com'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#common_params' do
|
63
|
+
{
|
64
|
+
:username => :USER,
|
65
|
+
:password => :PWD,
|
66
|
+
:signature => :SIGNATURE,
|
67
|
+
:subject => :SUBJECT,
|
68
|
+
:version => :VERSION
|
69
|
+
}.each do |option_key, param_key|
|
70
|
+
it "should include :#{param_key}" do
|
71
|
+
instance.common_params.should include(param_key)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should set :#{param_key} as #{option_key}" do
|
75
|
+
instance.common_params[param_key].should == instance.send(option_key)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe '#request' do
|
81
|
+
it 'should POST to NPV endpoint' do
|
82
|
+
expect do
|
83
|
+
instance.request :RPCMethod
|
84
|
+
end.to request_to Paypal::NVP::Request::ENDPOINT[:production], :post
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'when got API error response' do
|
88
|
+
before do
|
89
|
+
fake_response 'SetExpressCheckout/failure'
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'should raise Paypal::Exception::APIError' do
|
93
|
+
expect do
|
94
|
+
instance.request :SetExpressCheckout
|
95
|
+
end.to raise_error(Paypal::Exception::APIError)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'when got HTTP error response' do
|
100
|
+
before do
|
101
|
+
FakeWeb.register_uri(
|
102
|
+
:post,
|
103
|
+
Paypal::NVP::Request::ENDPOINT[:production],
|
104
|
+
:body => "Invalid Request",
|
105
|
+
:status => ["400", "Bad Request"]
|
106
|
+
)
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'should raise Paypal::Exception::HttpError' do
|
110
|
+
expect do
|
111
|
+
instance.request :SetExpressCheckout
|
112
|
+
end.to raise_error(Paypal::Exception::HttpError)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe Paypal::NVP::Response do
|
4
|
+
let(:return_url) { 'http://example.com/success' }
|
5
|
+
let(:cancel_url) { 'http://example.com/cancel' }
|
6
|
+
let :request do
|
7
|
+
Paypal::Express::Request.new(
|
8
|
+
:username => 'nov',
|
9
|
+
:password => 'password',
|
10
|
+
:signature => 'sig'
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
let :payment_request do
|
15
|
+
Paypal::Payment::Request.new(
|
16
|
+
:amount => 1000,
|
17
|
+
:description => 'Instant Payment Request'
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
let :recurring_profile do
|
22
|
+
Paypal::Payment::Recurring.new(
|
23
|
+
:start_date => Time.utc(2011, 2, 8, 9, 0, 0),
|
24
|
+
:description => 'Recurring Profile',
|
25
|
+
:billing => {
|
26
|
+
:period => :Month,
|
27
|
+
:frequency => 1,
|
28
|
+
:amount => 1000
|
29
|
+
}
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '.new' do
|
34
|
+
context 'when non-supported attributes are given' do
|
35
|
+
it 'should ignore them and warn' do
|
36
|
+
Paypal.logger.should_receive(:warn).with(
|
37
|
+
"Ignored Parameter (Paypal::NVP::Response): ignored=Ignore me!"
|
38
|
+
)
|
39
|
+
Paypal::NVP::Response.new(
|
40
|
+
:ignored => 'Ignore me!'
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when SetExpressCheckout response given' do
|
46
|
+
before do
|
47
|
+
fake_response 'SetExpressCheckout/success'
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should handle all attributes' do
|
51
|
+
Paypal.logger.should_not_receive(:warn)
|
52
|
+
response = request.setup payment_request, return_url, cancel_url
|
53
|
+
response.token.should == 'EC-5YJ90598G69065317'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when GetExpressCheckoutDetails response given' do
|
58
|
+
before do
|
59
|
+
fake_response 'GetExpressCheckoutDetails/success'
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should handle all attributes' do
|
63
|
+
Paypal.logger.should_not_receive(:warn)
|
64
|
+
response = request.details 'token'
|
65
|
+
response.payer.identifier.should == '9RWDTMRKKHQ8S'
|
66
|
+
response.payment_responses.size.should == 1
|
67
|
+
response.payment_info.size.should == 0
|
68
|
+
response.payment_responses.first.should be_instance_of(Paypal::Payment::Response)
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when BILLINGAGREEMENTACCEPTEDSTATUS included' do
|
72
|
+
before do
|
73
|
+
fake_response 'GetExpressCheckoutDetails/with_billing_accepted_status'
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should handle all attributes' do
|
77
|
+
Paypal.logger.should_not_receive(:warn)
|
78
|
+
response = request.details 'token'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'when DoExpressCheckoutPayment response given' do
|
84
|
+
before do
|
85
|
+
fake_response 'DoExpressCheckoutPayment/success'
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should handle all attributes' do
|
89
|
+
Paypal.logger.should_not_receive(:warn)
|
90
|
+
response = request.checkout! 'token', 'payer_id', payment_request
|
91
|
+
response.payment_responses.size.should == 0
|
92
|
+
response.payment_info.size.should == 1
|
93
|
+
response.payment_info.first.should be_instance_of(Paypal::Payment::Response::Info)
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'when billing_agreement is included' do
|
97
|
+
before do
|
98
|
+
fake_response 'DoExpressCheckoutPayment/success_with_billing_agreement'
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should have billing_agreement' do
|
102
|
+
Paypal.logger.should_not_receive(:warn)
|
103
|
+
response = request.checkout! 'token', 'payer_id', payment_request
|
104
|
+
response.billing_agreement.identifier.should == 'B-1XR87946TC504770W'
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'when CreateRecurringPaymentsProfile response given' do
|
110
|
+
before do
|
111
|
+
fake_response 'CreateRecurringPaymentsProfile/success'
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'should handle all attributes' do
|
115
|
+
Paypal.logger.should_not_receive(:warn)
|
116
|
+
response = request.subscribe! 'token', recurring_profile
|
117
|
+
response.recurring.identifier.should == 'I-L8N58XFUCET3'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context 'when GetRecurringPaymentsProfileDetails response given' do
|
122
|
+
before do
|
123
|
+
fake_response 'GetRecurringPaymentsProfileDetails/success'
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'should handle all attributes' do
|
127
|
+
Paypal.logger.should_not_receive(:warn)
|
128
|
+
response = request.subscription 'profile_id'
|
129
|
+
response.recurring.billing.amount.total.should == 1000
|
130
|
+
response.recurring.regular_billing.paid.should == 1000
|
131
|
+
response.recurring.summary.next_billing_date.should == '2011-03-04T10:00:00Z'
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'when ManageRecurringPaymentsProfileStatus response given' do
|
136
|
+
before do
|
137
|
+
fake_response 'ManageRecurringPaymentsProfileStatus/success'
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'should handle all attributes' do
|
141
|
+
Paypal.logger.should_not_receive(:warn)
|
142
|
+
request.renew! 'profile_id', :Cancel
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
describe Paypal::Payment::Common::Amount do
|
4
|
+
let :keys do
|
5
|
+
Paypal::Payment::Common::Amount.optional_attributes
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.new' do
|
9
|
+
it 'should not allow nil for attributes' do
|
10
|
+
amount = Paypal::Payment::Common::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::Common::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::Common::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,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Paypal::Payment::Recurring::Activation do
|
4
|
+
let :instance do
|
5
|
+
Paypal::Payment::Recurring::Activation.new(
|
6
|
+
:initial_amount => 100,
|
7
|
+
:failed_action => 'ContinueOnFailure'
|
8
|
+
)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#to_params' do
|
12
|
+
it 'should handle Recurring Profile activation parameters' do
|
13
|
+
instance.to_params.should == {
|
14
|
+
:INITAMT => '100.00',
|
15
|
+
:FAILEDINITAMTACTION => 'ContinueOnFailure'
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,170 @@
|
|
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 :trial_attributes do
|
9
|
+
{}
|
10
|
+
end
|
11
|
+
|
12
|
+
let :attributes do
|
13
|
+
{
|
14
|
+
:identifier => '12345',
|
15
|
+
:description => 'Subscription Payment Profile',
|
16
|
+
:status => 'Active',
|
17
|
+
:start_date => '2011-02-03T15:00:00Z',
|
18
|
+
:name => 'Nov Matake',
|
19
|
+
:auto_bill => 'NoAutoBill',
|
20
|
+
:max_fails => '0',
|
21
|
+
:aggregate_amount => '1000',
|
22
|
+
:aggregate_optional_amount => '0',
|
23
|
+
:final_payment_date => '1970-01-01T00:00:00Z',
|
24
|
+
:billing => {
|
25
|
+
:amount => Paypal::Payment::Common::Amount.new(
|
26
|
+
:total => '1000',
|
27
|
+
:shipping => '0',
|
28
|
+
:tax => '0'
|
29
|
+
),
|
30
|
+
:currency_code => 'JPY',
|
31
|
+
:period => 'Month',
|
32
|
+
:frequency => '1',
|
33
|
+
:total_cycles => '0',
|
34
|
+
:trial => trial_attributes
|
35
|
+
},
|
36
|
+
:regular_billing => {
|
37
|
+
:amount => '1000',
|
38
|
+
:shipping_amount => '0',
|
39
|
+
:tax_amount => '0',
|
40
|
+
:currency_code => 'JPY',
|
41
|
+
:period => 'Month',
|
42
|
+
:frequency => '1',
|
43
|
+
:total_cycles => '0',
|
44
|
+
:paid => '1000'
|
45
|
+
},
|
46
|
+
:summary => {
|
47
|
+
:next_billing_date => '2011-03-04T10:00:00Z',
|
48
|
+
:cycles_completed => '1',
|
49
|
+
:cycles_remaining => '18446744073709551615',
|
50
|
+
:outstanding_balance => '0',
|
51
|
+
:failed_count => '0',
|
52
|
+
:last_payment_date => '2011-02-04T10:50:56Z',
|
53
|
+
:last_payment_amount => '1000'
|
54
|
+
}
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
let :instance do
|
59
|
+
Paypal::Payment::Recurring.new attributes
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '.new' do
|
63
|
+
it 'should accept all supported attributes' do
|
64
|
+
instance.identifier.should == '12345'
|
65
|
+
instance.description.should == 'Subscription Payment Profile'
|
66
|
+
instance.status.should == 'Active'
|
67
|
+
instance.start_date.should == '2011-02-03T15:00:00Z'
|
68
|
+
instance.billing.trial.should be_nil
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when optional trial info given' do
|
72
|
+
let :trial_attributes do
|
73
|
+
{
|
74
|
+
:period => 'Month',
|
75
|
+
:frequency => '1',
|
76
|
+
:total_cycles => '0',
|
77
|
+
:currency_code => 'JPY',
|
78
|
+
:amount => '1000',
|
79
|
+
:shipping_amount => '0',
|
80
|
+
:tax_amount => '0'
|
81
|
+
}
|
82
|
+
end
|
83
|
+
it 'should setup trial billing info' do
|
84
|
+
instance.billing.trial.should == Paypal::Payment::Recurring::Billing.new(trial_attributes)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#to_params' do
|
90
|
+
it 'should handle Recurring Profile parameters' do
|
91
|
+
instance.to_params.should == {
|
92
|
+
:AUTOBILLOUTAMT => 'NoAutoBill',
|
93
|
+
:BILLINGFREQUENCY => 1,
|
94
|
+
:SHIPPINGAMT => '0.00',
|
95
|
+
:DESC => 'Subscription Payment Profile',
|
96
|
+
:SUBSCRIBERNAME => 'Nov Matake',
|
97
|
+
:BILLINGPERIOD => 'Month',
|
98
|
+
:AMT => '1000.00',
|
99
|
+
:MAXFAILEDPAYMENTS => 0,
|
100
|
+
:TOTALBILLINGCYCLES => 0,
|
101
|
+
:TAXAMT => '0.00',
|
102
|
+
:PROFILESTARTDATE => '2011-02-03T15:00:00Z',
|
103
|
+
:CURRENCYCODE => 'JPY'
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'when start_date is Time' do
|
108
|
+
it 'should be stringfy' do
|
109
|
+
instance = Paypal::Payment::Recurring.new attributes.merge(
|
110
|
+
:start_date => Time.utc(2011, 2, 8, 15, 0, 0)
|
111
|
+
)
|
112
|
+
instance.start_date.should be_instance_of(Time)
|
113
|
+
instance.to_params[:PROFILESTARTDATE].should == '2011-02-08 15:00:00'
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'when optional trial setting given' do
|
118
|
+
let :trial_attributes do
|
119
|
+
{
|
120
|
+
:period => 'Month',
|
121
|
+
:frequency => '1',
|
122
|
+
:total_cycles => '0',
|
123
|
+
:currency_code => 'JPY',
|
124
|
+
:amount => '1000',
|
125
|
+
:shipping_amount => '0',
|
126
|
+
:tax_amount => '0'
|
127
|
+
}
|
128
|
+
end
|
129
|
+
it 'should setup trial billing info' do
|
130
|
+
instance.to_params.should == {
|
131
|
+
:TRIALBILLINGPERIOD => "Month",
|
132
|
+
:TRIALBILLINGFREQUENCY => 1,
|
133
|
+
:TRIALTOTALBILLINGCYCLES => 0,
|
134
|
+
:TRIALAMT => "1000.00",
|
135
|
+
:TRIALCURRENCYCODE => "JPY",
|
136
|
+
:TRIALSHIPPINGAMT => "0.00",
|
137
|
+
:TRIALTAXAMT => "0.00",
|
138
|
+
:BILLINGPERIOD => "Month",
|
139
|
+
:BILLINGFREQUENCY => 1,
|
140
|
+
:TOTALBILLINGCYCLES => 0,
|
141
|
+
:AMT => "1000.00",
|
142
|
+
:CURRENCYCODE => "JPY",
|
143
|
+
:SHIPPINGAMT => "0.00",
|
144
|
+
:TAXAMT => "0.00",
|
145
|
+
:DESC => "Subscription Payment Profile",
|
146
|
+
:MAXFAILEDPAYMENTS => 0,
|
147
|
+
:AUTOBILLOUTAMT => "NoAutoBill",
|
148
|
+
:PROFILESTARTDATE => "2011-02-03T15:00:00Z",
|
149
|
+
:SUBSCRIBERNAME => "Nov Matake"
|
150
|
+
}
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
describe '#numeric_attribute?' do
|
156
|
+
let :numeric_attributes do
|
157
|
+
[:aggregate_amount, :aggregate_optional_amount, :max_fails, :failed_count]
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'should detect numeric attributes' do
|
161
|
+
numeric_attributes.each do |key|
|
162
|
+
instance.numeric_attribute?(key).should be_true
|
163
|
+
end
|
164
|
+
non_numeric_keys = keys - numeric_attributes
|
165
|
+
non_numeric_keys.each do |key|
|
166
|
+
instance.numeric_attribute?(key).should be_false
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|