pp-adaptive 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/README.md +54 -0
- data/Rakefile +8 -0
- data/lib/pp-adaptive/abstract_request.rb +44 -0
- data/lib/pp-adaptive/abstract_response.rb +46 -0
- data/lib/pp-adaptive/cancel_preapproval_request.rb +7 -0
- data/lib/pp-adaptive/cancel_preapproval_response.rb +7 -0
- data/lib/pp-adaptive/client.rb +56 -0
- data/lib/pp-adaptive/convert_currency_request.rb +33 -0
- data/lib/pp-adaptive/convert_currency_response.rb +11 -0
- data/lib/pp-adaptive/execute_payment_request.rb +9 -0
- data/lib/pp-adaptive/execute_payment_response.rb +12 -0
- data/lib/pp-adaptive/get_payment_options_request.rb +7 -0
- data/lib/pp-adaptive/get_payment_options_response.rb +32 -0
- data/lib/pp-adaptive/pay_request.rb +64 -0
- data/lib/pp-adaptive/pay_response.rb +29 -0
- data/lib/pp-adaptive/payment_details_request.rb +9 -0
- data/lib/pp-adaptive/payment_details_response.rb +53 -0
- data/lib/pp-adaptive/preapproval_details_request.rb +8 -0
- data/lib/pp-adaptive/preapproval_details_response.rb +35 -0
- data/lib/pp-adaptive/preapproval_request.rb +36 -0
- data/lib/pp-adaptive/preapproval_response.rb +7 -0
- data/lib/pp-adaptive/refund_request.rb +14 -0
- data/lib/pp-adaptive/refund_response.rb +12 -0
- data/lib/pp-adaptive/set_payment_options_request.rb +33 -0
- data/lib/pp-adaptive/set_payment_options_response.rb +7 -0
- data/lib/pp-adaptive/support/aliases.rb +33 -0
- data/lib/pp-adaptive/support/coerced_array.rb +52 -0
- data/lib/pp-adaptive/support/json_model.rb +140 -0
- data/lib/pp-adaptive/support/node.rb +45 -0
- data/lib/pp-adaptive/support/node_list.rb +45 -0
- data/lib/pp-adaptive/types/account_identifier.rb +6 -0
- data/lib/pp-adaptive/types/address.rb +17 -0
- data/lib/pp-adaptive/types/address_list.rb +5 -0
- data/lib/pp-adaptive/types/aliases/receiver_aliases.rb +15 -0
- data/lib/pp-adaptive/types/aliases/receiver_list_aliases.rb +32 -0
- data/lib/pp-adaptive/types/base_address.rb +11 -0
- data/lib/pp-adaptive/types/client_details_type.rb +12 -0
- data/lib/pp-adaptive/types/currency_code.rb +5 -0
- data/lib/pp-adaptive/types/currency_conversion.rb +17 -0
- data/lib/pp-adaptive/types/currency_conversion_list.rb +15 -0
- data/lib/pp-adaptive/types/currency_conversion_table.rb +5 -0
- data/lib/pp-adaptive/types/currency_list.rb +5 -0
- data/lib/pp-adaptive/types/currency_type.rb +6 -0
- data/lib/pp-adaptive/types/display_options.rb +8 -0
- data/lib/pp-adaptive/types/error_data.rb +11 -0
- data/lib/pp-adaptive/types/error_list.rb +5 -0
- data/lib/pp-adaptive/types/fault_message.rb +23 -0
- data/lib/pp-adaptive/types/funding_constraint.rb +5 -0
- data/lib/pp-adaptive/types/funding_plan.rb +28 -0
- data/lib/pp-adaptive/types/funding_plan_charge.rb +11 -0
- data/lib/pp-adaptive/types/funding_source.rb +9 -0
- data/lib/pp-adaptive/types/funding_type_info.rb +5 -0
- data/lib/pp-adaptive/types/funding_type_list.rb +5 -0
- data/lib/pp-adaptive/types/initiating_entity.rb +15 -0
- data/lib/pp-adaptive/types/institution_customer.rb +11 -0
- data/lib/pp-adaptive/types/invoice_data.rb +7 -0
- data/lib/pp-adaptive/types/invoice_item.rb +9 -0
- data/lib/pp-adaptive/types/pay_error.rb +18 -0
- data/lib/pp-adaptive/types/pay_error_list.rb +5 -0
- data/lib/pp-adaptive/types/payment_info.rb +16 -0
- data/lib/pp-adaptive/types/payment_info_list.rb +5 -0
- data/lib/pp-adaptive/types/phone_number_type.rb +7 -0
- data/lib/pp-adaptive/types/receiver.rb +17 -0
- data/lib/pp-adaptive/types/receiver_identifier.rb +12 -0
- data/lib/pp-adaptive/types/receiver_list.rb +5 -0
- data/lib/pp-adaptive/types/receiver_options.rb +21 -0
- data/lib/pp-adaptive/types/refund_info.rb +20 -0
- data/lib/pp-adaptive/types/refund_info_list.rb +5 -0
- data/lib/pp-adaptive/types/request_envelope.rb +6 -0
- data/lib/pp-adaptive/types/response_envelope.rb +13 -0
- data/lib/pp-adaptive/types/sender_identifier.rb +5 -0
- data/lib/pp-adaptive/types/sender_options.rb +5 -0
- data/lib/pp-adaptive/version.rb +3 -0
- data/lib/pp-adaptive.rb +75 -0
- data/pp-adaptive.gemspec +25 -0
- data/spec/public/cancel_preapproval_request_spec.rb +15 -0
- data/spec/public/cancel_preapproval_response_spec.rb +6 -0
- data/spec/public/client_spec.rb +85 -0
- data/spec/public/convert_currency_request_spec.rb +29 -0
- data/spec/public/convert_currency_response_spec.rb +62 -0
- data/spec/public/execute_payment_request_spec.rb +30 -0
- data/spec/public/execute_payment_response_spec.rb +66 -0
- data/spec/public/get_payment_options_request_spec.rb +15 -0
- data/spec/public/get_payment_options_response_spec.rb +141 -0
- data/spec/public/json_model_spec.rb +56 -0
- data/spec/public/node_list_spec.rb +58 -0
- data/spec/public/node_spec.rb +54 -0
- data/spec/public/pay_request_spec.rb +150 -0
- data/spec/public/pay_response_spec.rb +197 -0
- data/spec/public/payment_details_request_spec.rb +30 -0
- data/spec/public/payment_details_response_spec.rb +211 -0
- data/spec/public/preapproval_details_request_spec.rb +25 -0
- data/spec/public/preapproval_details_response_spec.rb +200 -0
- data/spec/public/preapproval_request_spec.rb +110 -0
- data/spec/public/preapproval_response_spec.rb +14 -0
- data/spec/public/refund_request_spec.rb +57 -0
- data/spec/public/refund_response_spec.rb +116 -0
- data/spec/public/set_payment_options_request_spec.rb +136 -0
- data/spec/public/set_payment_options_response_spec.rb +6 -0
- data/spec/shared/a_fault_message.rb +60 -0
- data/spec/shared/a_request_envelope.rb +14 -0
- data/spec/shared/a_response_envelope.rb +36 -0
- data/spec/spec_helper.rb +6 -0
- metadata +225 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class InitiatingEntity < JsonModel
|
3
|
+
attribute :institution_customer, Node[InstitutionCustomer], :param => "institutionCustomer"
|
4
|
+
|
5
|
+
alias_params :institution_customer, {
|
6
|
+
:institution_id => :institution_id,
|
7
|
+
:customer_first_name => :first_name,
|
8
|
+
:customer_last_name => :last_name,
|
9
|
+
:customer_display_name => :display_name,
|
10
|
+
:institution_customer_id => :institution_customer_id,
|
11
|
+
:customer_country_code => :country_code,
|
12
|
+
:customer_email => :email
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class InstitutionCustomer < JsonModel
|
3
|
+
attribute :institution_id, String, :param => "institutionId"
|
4
|
+
attribute :first_name, String, :param => "firstName"
|
5
|
+
attribute :last_name, String, :param => "lastName"
|
6
|
+
attribute :display_name, String, :param => "displayName"
|
7
|
+
attribute :institution_customer_id, String, :param => "institutionCustomerId"
|
8
|
+
attribute :country_code, String, :param => "countryCode"
|
9
|
+
attribute :email, String
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class InvoiceItem < JsonModel
|
3
|
+
attribute :name, String
|
4
|
+
attribute :identifier, String
|
5
|
+
attribute :price, Decimal
|
6
|
+
attribute :item_price, Decimal, :param => "itemPrice"
|
7
|
+
attribute :item_count, Integer, :param => "itemCount"
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class PayError < JsonModel
|
3
|
+
attribute :receiver, Node[Receiver]
|
4
|
+
attribute :error, Node[ErrorData]
|
5
|
+
|
6
|
+
include ReceiverAliases
|
7
|
+
|
8
|
+
alias_params :error, {
|
9
|
+
:error_id => :id,
|
10
|
+
:error_domain => :domain,
|
11
|
+
:error_subdomain => :subdomain,
|
12
|
+
:error_severity => :severity,
|
13
|
+
:error_category => :category,
|
14
|
+
:error_message => :message,
|
15
|
+
:error_parameters => :parameters
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class PaymentInfo < JsonModel
|
3
|
+
attribute :transaction_id, String, :param => "transactionId"
|
4
|
+
attribute :transaction_status, String, :param => "transactionStatus"
|
5
|
+
attribute :receiver, Node[Receiver]
|
6
|
+
attribute :refunded_amount, Decimal, :param => "refundedAmount"
|
7
|
+
attribute :pending_refund, Boolean, :param => "pendingRefund"
|
8
|
+
attribute :sender_transaction_id, String, :param => "senderTransactionId"
|
9
|
+
attribute :sender_transaction_status, String, :param => "senderTransactionStatus"
|
10
|
+
attribute :pending_reason, String, :param => "pendingReason"
|
11
|
+
|
12
|
+
include ReceiverAliases
|
13
|
+
end
|
14
|
+
|
15
|
+
# FIXME: Add predicates for the transaction_status
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class Receiver < JsonModel
|
3
|
+
attribute :phone, Node[PhoneNumberType]
|
4
|
+
attribute :email, String
|
5
|
+
attribute :amount, Decimal
|
6
|
+
attribute :payment_type, String, :param => "paymentType"
|
7
|
+
attribute :payment_subtype, String, :param => "paymentSubType"
|
8
|
+
attribute :primary, Boolean
|
9
|
+
attribute :invoice_id, String, :param => "invoiceId"
|
10
|
+
|
11
|
+
alias_params :phone, {
|
12
|
+
:phone_country_code => :country_code,
|
13
|
+
:phone_number => :phone_number,
|
14
|
+
:phone_extension => :extension
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class ReceiverIdentifier < JsonModel
|
3
|
+
attribute :email, String
|
4
|
+
attribute :phone, Node[PhoneNumberType]
|
5
|
+
|
6
|
+
alias_params :phone, {
|
7
|
+
:phone_country_code => :country_code,
|
8
|
+
:phone_number => :phone_number,
|
9
|
+
:phone_extension => :extension
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class ReceiverOptions < JsonModel
|
3
|
+
attribute :description, String
|
4
|
+
attribute :custom_id, String, :param => "customId"
|
5
|
+
attribute :invoice_data, Node[InvoiceData], :param => "invoiceData"
|
6
|
+
attribute :receiver, Node[ReceiverIdentifier], :param => "receiver"
|
7
|
+
|
8
|
+
alias_params :invoice_data, {
|
9
|
+
:items => :items,
|
10
|
+
:total_tax => :total_tax,
|
11
|
+
:total_shipping => :total_shipping
|
12
|
+
}
|
13
|
+
|
14
|
+
alias_params :receiver, {
|
15
|
+
:receiver_email => :email,
|
16
|
+
:receiver_phone_country_code => :phone_country_code,
|
17
|
+
:receiver_phone_number => :phone_number,
|
18
|
+
:receiver_phone_extension => :phone_extension
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class RefundInfo < JsonModel
|
3
|
+
attribute :receiver, Node[Receiver]
|
4
|
+
attribute :refund_status, String, :param => "refundStatus"
|
5
|
+
attribute :refund_net_amount, Decimal, :param => "refundNetAmount"
|
6
|
+
attribute :refund_fee_amount, Decimal, :param => "refundFeeAmount"
|
7
|
+
attribute :refund_gross_amount, Decimal, :param => "refundGrossAmount"
|
8
|
+
attribute :total_of_all_refunds, Decimal, :param => "totalOfAllRefunds"
|
9
|
+
attribute :refund_has_become_full, Boolean, :param => "refundHasBecomeFull"
|
10
|
+
attribute :encrypted_refund_transaction_id, String, :param => "encryptedRefundTransactionId"
|
11
|
+
attribute :refund_transaction_status, String, :param => "refundTransactionStatus"
|
12
|
+
attribute :error_list, Node[ErrorList], :param => "errorList"
|
13
|
+
|
14
|
+
include ReceiverAliases
|
15
|
+
|
16
|
+
alias_params :error_list, {
|
17
|
+
:errors => :errors
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module AdaptivePayments
|
2
|
+
class ResponseEnvelope < JsonModel
|
3
|
+
attribute :ack_code, String, :param => "ack"
|
4
|
+
attribute :build, String, :param => "build"
|
5
|
+
attribute :correlation_id, String, :param => "correlationId"
|
6
|
+
attribute :time, DateTime, :param => "timestamp"
|
7
|
+
|
8
|
+
["Success", "Failure", "Warning", "SuccessWithWarning", "FailureWithWarning"].each do |ack|
|
9
|
+
method = ack.split(/(?=[A-Z])/).map{ |w| w.downcase }.join("_") + "?"
|
10
|
+
define_method(method) { ack_code == ack }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/pp-adaptive.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require "pp-adaptive/version"
|
2
|
+
|
3
|
+
require "pp-adaptive/support/aliases"
|
4
|
+
require "pp-adaptive/support/json_model"
|
5
|
+
require "pp-adaptive/support/coerced_array"
|
6
|
+
require "pp-adaptive/support/node"
|
7
|
+
require "pp-adaptive/support/node_list"
|
8
|
+
|
9
|
+
require "pp-adaptive/types/aliases/receiver_aliases"
|
10
|
+
require "pp-adaptive/types/aliases/receiver_list_aliases"
|
11
|
+
|
12
|
+
require "pp-adaptive/types/client_details_type"
|
13
|
+
require "pp-adaptive/types/request_envelope"
|
14
|
+
require "pp-adaptive/types/phone_number_type"
|
15
|
+
require "pp-adaptive/types/receiver"
|
16
|
+
require "pp-adaptive/types/receiver_list"
|
17
|
+
require "pp-adaptive/types/account_identifier"
|
18
|
+
require "pp-adaptive/types/sender_identifier"
|
19
|
+
require "pp-adaptive/types/funding_type_info"
|
20
|
+
require "pp-adaptive/types/funding_type_list"
|
21
|
+
require "pp-adaptive/types/funding_constraint"
|
22
|
+
require "pp-adaptive/types/response_envelope"
|
23
|
+
require "pp-adaptive/types/error_data"
|
24
|
+
require "pp-adaptive/types/error_list"
|
25
|
+
require "pp-adaptive/types/fault_message"
|
26
|
+
require "pp-adaptive/types/base_address"
|
27
|
+
require "pp-adaptive/types/address"
|
28
|
+
require "pp-adaptive/types/address_list"
|
29
|
+
require "pp-adaptive/types/currency_type"
|
30
|
+
require "pp-adaptive/types/currency_code"
|
31
|
+
require "pp-adaptive/types/currency_list"
|
32
|
+
require "pp-adaptive/types/currency_conversion"
|
33
|
+
require "pp-adaptive/types/currency_conversion_list"
|
34
|
+
require "pp-adaptive/types/currency_conversion_table"
|
35
|
+
require "pp-adaptive/types/funding_source"
|
36
|
+
require "pp-adaptive/types/funding_plan_charge"
|
37
|
+
require "pp-adaptive/types/funding_plan"
|
38
|
+
require "pp-adaptive/types/invoice_item"
|
39
|
+
require "pp-adaptive/types/invoice_data"
|
40
|
+
require "pp-adaptive/types/institution_customer"
|
41
|
+
require "pp-adaptive/types/initiating_entity"
|
42
|
+
require "pp-adaptive/types/receiver_identifier"
|
43
|
+
require "pp-adaptive/types/display_options"
|
44
|
+
require "pp-adaptive/types/sender_options"
|
45
|
+
require "pp-adaptive/types/receiver_options"
|
46
|
+
require "pp-adaptive/types/pay_error"
|
47
|
+
require "pp-adaptive/types/pay_error_list"
|
48
|
+
require "pp-adaptive/types/payment_info"
|
49
|
+
require "pp-adaptive/types/payment_info_list"
|
50
|
+
require "pp-adaptive/types/refund_info"
|
51
|
+
require "pp-adaptive/types/refund_info_list"
|
52
|
+
|
53
|
+
require "pp-adaptive/abstract_request"
|
54
|
+
require "pp-adaptive/abstract_response"
|
55
|
+
require "pp-adaptive/pay_request"
|
56
|
+
require "pp-adaptive/pay_response"
|
57
|
+
require "pp-adaptive/payment_details_request"
|
58
|
+
require "pp-adaptive/payment_details_response"
|
59
|
+
require "pp-adaptive/execute_payment_request"
|
60
|
+
require "pp-adaptive/execute_payment_response"
|
61
|
+
require "pp-adaptive/get_payment_options_request"
|
62
|
+
require "pp-adaptive/get_payment_options_response"
|
63
|
+
require "pp-adaptive/set_payment_options_request"
|
64
|
+
require "pp-adaptive/set_payment_options_response"
|
65
|
+
require "pp-adaptive/preapproval_request"
|
66
|
+
require "pp-adaptive/preapproval_response"
|
67
|
+
require "pp-adaptive/preapproval_details_request"
|
68
|
+
require "pp-adaptive/preapproval_details_response"
|
69
|
+
require "pp-adaptive/cancel_preapproval_request"
|
70
|
+
require "pp-adaptive/cancel_preapproval_response"
|
71
|
+
require "pp-adaptive/refund_request"
|
72
|
+
require "pp-adaptive/refund_response"
|
73
|
+
require "pp-adaptive/convert_currency_request"
|
74
|
+
require "pp-adaptive/convert_currency_response"
|
75
|
+
require "pp-adaptive/client"
|
data/pp-adaptive.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "pp-adaptive/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "pp-adaptive"
|
7
|
+
s.version = AdaptivePayments::VERSION
|
8
|
+
s.authors = ["d11wtq"]
|
9
|
+
s.email = ["chris@w3style.co.uk"]
|
10
|
+
s.homepage = "https://github.com/"
|
11
|
+
s.summary = %q{Rubygem for working with PayPal's Adaptive Payments API}
|
12
|
+
s.description = %q{Currently provides just a subset of PayPal's API, for setting up preapproval agreements and taking payments}
|
13
|
+
|
14
|
+
s.rubyforge_project = "pp-adaptive"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_runtime_dependency "rest-client"
|
22
|
+
s.add_runtime_dependency "virtus", ">= 0.0.9"
|
23
|
+
s.add_runtime_dependency "json"
|
24
|
+
s.add_development_dependency "rspec", ">= 2.6"
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe AdaptivePayments::CancelPreapprovalRequest do
|
4
|
+
it_behaves_like "a RequestEnvelope"
|
5
|
+
|
6
|
+
subject { AdaptivePayments::CancelPreapprovalRequest }
|
7
|
+
its(:operation) { should == :CancelPreapproval }
|
8
|
+
|
9
|
+
let(:request) { AdaptivePayments::CancelPreapprovalRequest.new(:preapproval_key => "ABCD-1234") }
|
10
|
+
let(:json) { JSON.parse(request.to_json) }
|
11
|
+
|
12
|
+
it "maps #preapproval_key to ['preapprovalKey']" do
|
13
|
+
json["preapprovalKey"].should == "ABCD-1234"
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe AdaptivePayments::Client do
|
4
|
+
let(:rest_client) { double(:post => nil).tap { |d| d.stub(:[] => d) } }
|
5
|
+
let(:request_class) { stub(:operation => :Test, :build_response => nil) }
|
6
|
+
let(:request) { stub(:class => request_class, :to_json => '{}') }
|
7
|
+
let(:client) { AdaptivePayments::Client.new }
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
RestClient::Resource.stub(:new).and_return(rest_client)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "uses the production endpoint by default" do
|
14
|
+
RestClient::Resource.should_receive(:new) \
|
15
|
+
.with("https://svcs.paypal.com/AdaptivePayments", an_instance_of(Hash)) \
|
16
|
+
.and_return(rest_client)
|
17
|
+
client.execute(request)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "uses the sandbox when sandbox? is true" do
|
21
|
+
client.sandbox = true
|
22
|
+
RestClient::Resource.should_receive(:new) \
|
23
|
+
.with("https://svcs.sandbox.paypal.com/AdaptivePayments", an_instance_of(Hash)) \
|
24
|
+
.and_return(rest_client)
|
25
|
+
client.execute(request)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "sends the user ID in the headers to the endpoint" do
|
29
|
+
client.user_id = "a.user.id"
|
30
|
+
RestClient::Resource.should_receive(:new) \
|
31
|
+
.with(/^https:\/\/.*/, :headers => hash_including("X-PAYPAL-SECURITY-USERID" => "a.user.id")) \
|
32
|
+
.and_return(rest_client)
|
33
|
+
client.execute(request)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "sends the password in the headers to the endpoint" do
|
37
|
+
client.password = "123456"
|
38
|
+
RestClient::Resource.should_receive(:new) \
|
39
|
+
.with(/^https:\/\/.*/, :headers => hash_including("X-PAYPAL-SECURITY-PASSWORD" => "123456")) \
|
40
|
+
.and_return(rest_client)
|
41
|
+
client.execute(request)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "sends the signature in the headers to the endpoint" do
|
45
|
+
client.signature = "a.signature"
|
46
|
+
RestClient::Resource.should_receive(:new) \
|
47
|
+
.with(/^https:\/\/.*/, :headers => hash_including("X-PAYPAL-SECURITY-SIGNATURE" => "a.signature")) \
|
48
|
+
.and_return(rest_client)
|
49
|
+
client.execute(request)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "sends the application ID in the headers to the endpoint" do
|
53
|
+
client.app_id = "an.app.id"
|
54
|
+
RestClient::Resource.should_receive(:new) \
|
55
|
+
.with(/^https:\/\/.*/, :headers => hash_including("X-PAYPAL-APPLICATION-ID" => "an.app.id")) \
|
56
|
+
.and_return(rest_client)
|
57
|
+
client.execute(request)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "sets the request format to JSON" do
|
61
|
+
RestClient::Resource.should_receive(:new) \
|
62
|
+
.with(/^https:\/\/.*/, :headers => hash_including("X-PAYPAL-REQUEST-DATA-FORMAT" => "JSON")) \
|
63
|
+
.and_return(rest_client)
|
64
|
+
client.execute(request)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "sets the response format to JSON" do
|
68
|
+
RestClient::Resource.should_receive(:new) \
|
69
|
+
.with(/^https:\/\/.*/, :headers => hash_including("X-PAYPAL-RESPONSE-DATA-FORMAT" => "JSON")) \
|
70
|
+
.and_return(rest_client)
|
71
|
+
client.execute(request)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "sends requests to the given API operation" do
|
75
|
+
request.class.stub(:operation => :Preapproval)
|
76
|
+
rest_client.should_receive(:[]).with("Preapproval")
|
77
|
+
client.execute(request)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "uses the request class to build a response" do
|
81
|
+
response = stub(:response)
|
82
|
+
request_class.should_receive(:build_response).and_return(response)
|
83
|
+
client.execute(request).should == response
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe AdaptivePayments::ConvertCurrencyRequest do
|
4
|
+
it_behaves_like "a RequestEnvelope"
|
5
|
+
|
6
|
+
subject { AdaptivePayments::ConvertCurrencyRequest }
|
7
|
+
its(:operation) { should == :ConvertCurrency }
|
8
|
+
|
9
|
+
let(:request) do
|
10
|
+
AdaptivePayments::ConvertCurrencyRequest.new(
|
11
|
+
:currencies => [ { :amount => '14.99', :code => 'USD' },
|
12
|
+
{ :amount => '129.99', :code => 'USD' } ],
|
13
|
+
:convert_to_currencies => ['JPY'],
|
14
|
+
:country_code => 'JP',
|
15
|
+
:conversion_type => 'SENDER_SIDE'
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:json) { JSON.parse(request.to_json) }
|
20
|
+
|
21
|
+
it "maps #currency.first.amount to ['baseAmountList']['currency'][0]['amount']" do
|
22
|
+
json["baseAmountList"]["currency"][0]["amount"].should == "14.99"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "maps #currency.first.amount to ['baseAmountList']['currency'][1]['amount']" do
|
26
|
+
json["baseAmountList"]["currency"][1]["amount"].should == "129.99"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe AdaptivePayments::ConvertCurrencyResponse do
|
4
|
+
it_behaves_like "a ResponseEnvelope"
|
5
|
+
it_behaves_like "a FaultMessage"
|
6
|
+
|
7
|
+
let(:response) do
|
8
|
+
AdaptivePayments::ConvertCurrencyResponse.from_json(
|
9
|
+
{
|
10
|
+
:estimatedAmountTable => {
|
11
|
+
:currencyConversionList => [
|
12
|
+
{
|
13
|
+
:baseAmount => {
|
14
|
+
:code => "USD",
|
15
|
+
:amount => "14.99"
|
16
|
+
},
|
17
|
+
:currencyList => {
|
18
|
+
:currency => [
|
19
|
+
{
|
20
|
+
:code => "JPY",
|
21
|
+
:amount => "1733"
|
22
|
+
}
|
23
|
+
]
|
24
|
+
}
|
25
|
+
},
|
26
|
+
{
|
27
|
+
:baseAmount => {
|
28
|
+
:code => "USD",
|
29
|
+
:amount => "129.99"
|
30
|
+
},
|
31
|
+
:currencyList => {
|
32
|
+
:currency => [
|
33
|
+
{
|
34
|
+
:code => "JPY",
|
35
|
+
:amount => "15036"
|
36
|
+
}
|
37
|
+
]
|
38
|
+
}
|
39
|
+
}
|
40
|
+
]
|
41
|
+
}
|
42
|
+
}.to_json
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "maps ['estimatedAmountTable']['currencyConversionList']['baseAmount']['code'] to #currency_conversions[0].base_currency_code" do
|
47
|
+
response.currency_conversions.first.base_currency_code.should == "USD"
|
48
|
+
end
|
49
|
+
|
50
|
+
it "maps ['estimatedAmountTable']['currencyConversionList']['baseAmount']['amount'] to #currency_conversions[0].base_currency_amount" do
|
51
|
+
response.currency_conversions.first.base_currency_amount.should == BigDecimal.new("14.99")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "maps ['estimatedAmountTable']['currencyConversionList']['currencyList']['currency][0]['code'] to #currency_conversions[0].currencies[0].currency_code" do
|
55
|
+
response.currency_conversions.first.currencies.first.code.should == "JPY"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "maps ['estimatedAmountTable']['currencyConversionList']['currencyList']['currency][0]['amount'] to #currency_conversions[0].currencies[0].currency_amount" do
|
59
|
+
response.currency_conversions.first.currencies.first.amount.should == BigDecimal.new("1733")
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe AdaptivePayments::ExecutePaymentRequest do
|
4
|
+
it_behaves_like "a RequestEnvelope"
|
5
|
+
|
6
|
+
subject { AdaptivePayments::ExecutePaymentRequest }
|
7
|
+
its(:operation) { should == :ExecutePayment }
|
8
|
+
|
9
|
+
let(:request) do
|
10
|
+
AdaptivePayments::ExecutePaymentRequest.new(
|
11
|
+
:action_type => "PAY",
|
12
|
+
:pay_key => "ABCD-1234",
|
13
|
+
:funding_plan_id => "funding123"
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:json) { JSON.parse(request.to_json) }
|
18
|
+
|
19
|
+
it "maps #action_type to ['actionType']" do
|
20
|
+
json["actionType"].should == "PAY"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "maps #pay_key to ['payKey']" do
|
24
|
+
json["payKey"].should == "ABCD-1234"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "maps #funding_plan_id to ['fundingPlanId']" do
|
28
|
+
json["fundingPlanId"].should == "funding123"
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe AdaptivePayments::ExecutePaymentResponse do
|
4
|
+
it_behaves_like "a ResponseEnvelope"
|
5
|
+
it_behaves_like "a FaultMessage"
|
6
|
+
|
7
|
+
let(:response) do
|
8
|
+
AdaptivePayments::ExecutePaymentResponse.from_json(
|
9
|
+
{
|
10
|
+
:paymentExecStatus => "Completed",
|
11
|
+
:payErrorList => {
|
12
|
+
:payError => [
|
13
|
+
{
|
14
|
+
:receiver => {
|
15
|
+
:email => "bob@site.com",
|
16
|
+
:amount => "5.00"
|
17
|
+
},
|
18
|
+
:error => {
|
19
|
+
:domain => "APPLICATION",
|
20
|
+
:message => "there was an error"
|
21
|
+
}
|
22
|
+
},
|
23
|
+
{
|
24
|
+
:receiver => {
|
25
|
+
:email => "sally@site.com",
|
26
|
+
:amount => "10.00"
|
27
|
+
},
|
28
|
+
:error => {
|
29
|
+
:domain => "APPLICATION",
|
30
|
+
:message => "there was another error"
|
31
|
+
}
|
32
|
+
}
|
33
|
+
]
|
34
|
+
}
|
35
|
+
}.to_json
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "maps ['paymentExecStatus'] to #payment_exec_status" do
|
40
|
+
response.payment_exec_status.should == "Completed"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "maps ['payErrorList']['payError'][0]['receiver']['email'] to #pay_errors.first.receiver_email" do
|
44
|
+
response.pay_errors.first.receiver_email.should == "bob@site.com"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "maps ['payErrorList']['payError'][0]['receiver']['amount'] to #pay_errors.first.receiver_amount" do
|
48
|
+
response.pay_errors.first.receiver_amount.should == BigDecimal("5.00")
|
49
|
+
end
|
50
|
+
|
51
|
+
it "maps ['payErrorList']['payError'][0]['error']['domain'] to #pay_errors.first.error_domain" do
|
52
|
+
response.pay_errors.first.error_domain.should == "APPLICATION"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "maps ['payErrorList']['payError'][0]['error']['message'] to #pay_errors.first.error_message" do
|
56
|
+
response.pay_errors.first.error_message.should == "there was an error"
|
57
|
+
end
|
58
|
+
|
59
|
+
it "maps ['payErrorList']['payError'][1]['receiver']['email'] to #pay_errors.last.receiver_email" do
|
60
|
+
response.pay_errors.last.receiver_email.should == "sally@site.com"
|
61
|
+
end
|
62
|
+
|
63
|
+
it "maps ['payErrorList']['payError'][1]['error']['message'] to #pay_errors.last.error_message" do
|
64
|
+
response.pay_errors.last.error_message.should == "there was another error"
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe AdaptivePayments::GetPaymentOptionsRequest do
|
4
|
+
it_behaves_like "a RequestEnvelope"
|
5
|
+
|
6
|
+
subject { AdaptivePayments::GetPaymentOptionsRequest }
|
7
|
+
its(:operation) { should == :GetPaymentOptions }
|
8
|
+
|
9
|
+
let(:request) { AdaptivePayments::GetPaymentOptionsRequest.new(:pay_key => "ABCD-1234") }
|
10
|
+
let(:json) { JSON.parse(request.to_json) }
|
11
|
+
|
12
|
+
it "maps #pay_key to ['payKey']" do
|
13
|
+
json["payKey"].should == "ABCD-1234"
|
14
|
+
end
|
15
|
+
end
|