pensio_api 0.2.1 → 0.2.2
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 +13 -5
- data/.rspec +2 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +83 -0
- data/Guardfile +23 -0
- data/LICENSE +24 -0
- data/README.md +77 -0
- data/lib/pensio_api/billing_address.rb +15 -0
- data/lib/pensio_api/callback.rb +30 -0
- data/lib/pensio_api/credentials.rb +7 -0
- data/lib/pensio_api/ecommerce.rb +13 -0
- data/lib/pensio_api/errors/bad_request.rb +15 -0
- data/lib/pensio_api/errors/gateway_error.rb +21 -0
- data/lib/pensio_api/errors/no_credentials.rb +9 -0
- data/lib/pensio_api/funding_list.rb +30 -0
- data/lib/pensio_api/funding_list_request.rb +15 -0
- data/lib/pensio_api/mixins/has_transactions.rb +36 -0
- data/lib/pensio_api/mixins/id.rb +9 -0
- data/lib/pensio_api/mixins/method_missing.rb +9 -0
- data/lib/pensio_api/mixins/request_defaults.rb +50 -0
- data/lib/pensio_api/mixins/timestamps.rb +13 -0
- data/lib/pensio_api/request.rb +18 -0
- data/lib/pensio_api/reservation.rb +28 -0
- data/lib/pensio_api/responses/base.rb +32 -0
- data/lib/pensio_api/responses/funding_list.rb +43 -0
- data/lib/pensio_api/responses/gateway_url.rb +13 -0
- data/lib/pensio_api/responses/refund.rb +17 -0
- data/lib/pensio_api/responses/reservation.rb +15 -0
- data/lib/pensio_api/responses/reservation_capture.rb +14 -0
- data/lib/pensio_api/responses/reservation_release.rb +6 -0
- data/lib/pensio_api/responses/subscription_charge.rb +21 -0
- data/lib/pensio_api/responses/subscription_failure_callback.rb +21 -0
- data/lib/pensio_api/responses/success_callback.rb +21 -0
- data/lib/pensio_api/responses/terminal.rb +41 -0
- data/lib/pensio_api/responses/transaction.rb +13 -0
- data/lib/pensio_api/subscription.rb +30 -0
- data/lib/pensio_api/terminal.rb +17 -0
- data/lib/pensio_api/transaction.rb +84 -0
- data/lib/pensio_api.rb +36 -0
- data/pensio_api.gemspec +20 -0
- data/spec/lib/pensio_api/billing_address_spec.rb +40 -0
- data/spec/lib/pensio_api/callback_spec.rb +21 -0
- data/spec/lib/pensio_api/ecommerce_spec.rb +22 -0
- data/spec/lib/pensio_api/errors/bad_request_spec.rb +31 -0
- data/spec/lib/pensio_api/errors/gateway_error_spec.rb +38 -0
- data/spec/lib/pensio_api/funding_list_request_spec.rb +17 -0
- data/spec/lib/pensio_api/funding_list_spec.rb +38 -0
- data/spec/lib/pensio_api/request_spec.rb +122 -0
- data/spec/lib/pensio_api/reservation_spec.rb +32 -0
- data/spec/lib/pensio_api/responses/base_spec.rb +68 -0
- data/spec/lib/pensio_api/responses/funding_list_spec.rb +23 -0
- data/spec/lib/pensio_api/responses/gateway_url_spec.rb +17 -0
- data/spec/lib/pensio_api/responses/refund_spec.rb +18 -0
- data/spec/lib/pensio_api/responses/reservation_capture_spec.rb +18 -0
- data/spec/lib/pensio_api/responses/reservation_release_spec.rb +12 -0
- data/spec/lib/pensio_api/responses/reservation_spec.rb +15 -0
- data/spec/lib/pensio_api/responses/subscription_charge_spec.rb +56 -0
- data/spec/lib/pensio_api/responses/subscription_failure_callback_spec.rb +48 -0
- data/spec/lib/pensio_api/responses/success_callback_spec.rb +45 -0
- data/spec/lib/pensio_api/responses/terminal_spec.rb +55 -0
- data/spec/lib/pensio_api/responses/transaction_spec.rb +56 -0
- data/spec/lib/pensio_api/subscription_spec.rb +37 -0
- data/spec/lib/pensio_api/terminal_spec.rb +18 -0
- data/spec/lib/pensio_api/transaction_spec.rb +101 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/support/fixtures/bad_request_error.xml +10 -0
- data/spec/support/fixtures/capture_reservation.xml +84 -0
- data/spec/support/fixtures/charge_subscription.xml +89 -0
- data/spec/support/fixtures/create_multi_payment_request.xml +13 -0
- data/spec/support/fixtures/create_payment_request.xml +13 -0
- data/spec/support/fixtures/failure_callback.xml +76 -0
- data/spec/support/fixtures/funding_download.csv +6 -0
- data/spec/support/fixtures/funding_list.xml +43 -0
- data/spec/support/fixtures/get_terminals.xml +38 -0
- data/spec/support/fixtures/get_terminals_none.xml +12 -0
- data/spec/support/fixtures/get_terminals_single.xml +28 -0
- data/spec/support/fixtures/multiple_payments.xml +146 -0
- data/spec/support/fixtures/payments.xml +80 -0
- data/spec/support/fixtures/payments_none.xml +13 -0
- data/spec/support/fixtures/pensio_error.xml +48 -0
- data/spec/support/fixtures/refund_captured_reservation.xml +88 -0
- data/spec/support/fixtures/release_reservation.xml +72 -0
- data/spec/support/fixtures/reservation_of_fixed_amount.xml +46 -0
- data/spec/support/fixtures/reserve_subscription_charge.xml +86 -0
- data/spec/support/fixtures/setup_subscription.xml +46 -0
- data/spec/support/fixtures/subscription_failure_callback.xml +132 -0
- data/spec/support/fixtures/success_callback.xml +119 -0
- data/spec/support/helpers.rb +38 -0
- metadata +150 -15
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Request do
|
4
|
+
describe '.new' do
|
5
|
+
before :each do
|
6
|
+
PensioAPI::Request.stub(:post).and_return(construct_response(nil))
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'POSTs to the given API path and passes in request options' do
|
10
|
+
request_options = PensioAPI::Request.new('/test').send(:request_options, {})
|
11
|
+
PensioAPI::Request.should_receive(:post).with('/test', request_options)
|
12
|
+
PensioAPI::Request.new('/test')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.response_contains' do
|
17
|
+
context 'with a populated response body' do
|
18
|
+
before :each do
|
19
|
+
PensioAPI::Request.stub(:post).and_return(
|
20
|
+
construct_response({
|
21
|
+
'Test' => 'true'
|
22
|
+
})
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:request) { PensioAPI::Request.new('/test') }
|
27
|
+
|
28
|
+
context 'given a valid key' do
|
29
|
+
it 'returns true' do
|
30
|
+
expect(request.response_contains?('Test')).to be_true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'given an invalid key' do
|
35
|
+
it 'returns false' do
|
36
|
+
expect(request.response_contains?('OtherTest')).to be_false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with an empty response body' do
|
42
|
+
before :each do
|
43
|
+
PensioAPI::Request.stub(:post).and_return(construct_response(nil))
|
44
|
+
end
|
45
|
+
|
46
|
+
let(:request) { PensioAPI::Request.new('/test') }
|
47
|
+
|
48
|
+
it 'returns false' do
|
49
|
+
expect(request.response_contains?('Test')).to be_false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '.request_options' do
|
55
|
+
before :each do
|
56
|
+
PensioAPI::Request.stub(:post).and_return(construct_response(nil))
|
57
|
+
end
|
58
|
+
|
59
|
+
let(:p) { PensioAPI::Request.new('/test') }
|
60
|
+
|
61
|
+
specify { expect(p.send(:request_options, {})[:basic_auth]).to_not be_nil }
|
62
|
+
|
63
|
+
it 'appends basic auth to the options' do
|
64
|
+
expect(p.send(:request_options, {})[:basic_auth]).to eq(p.send(:auth))
|
65
|
+
end
|
66
|
+
|
67
|
+
specify { expect(p.send(:request_options, {})[:headers]).to_not be_nil }
|
68
|
+
|
69
|
+
it 'appends headers to the options' do
|
70
|
+
expect(p.send(:request_options, {})[:headers]).to eq(PensioAPI::Request::HEADERS)
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'with additional headers' do
|
74
|
+
it 'merges given headers into the defaults' do
|
75
|
+
headers = p.send(:request_options, { headers: {'Test' => '1234'} })[:headers]
|
76
|
+
expect(headers).to eq({'Test' => '1234'}.merge(PensioAPI::Request::HEADERS))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'with body parameters' do
|
81
|
+
it 'assigns these to the body parameter' do
|
82
|
+
expect(p.send(:request_options, {transaction_id: 5432})[:body][:transaction_id]).to eq(5432)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe 'error handling' do
|
88
|
+
context 'with a bad request' do
|
89
|
+
before :each do
|
90
|
+
stub_pensio_response('/merchant/API/payments', 'bad_request_error')
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'raises a PensioAPI::Errors::BadRequest error' do
|
94
|
+
expect(->{ PensioAPI::Transaction.find }).to raise_error(PensioAPI::Errors::BadRequest)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'with a gateway error' do
|
99
|
+
before :each do
|
100
|
+
stub_pensio_response('/merchant/API/payments', 'pensio_error')
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'raises a PensioAPI::Errors::GatewayError' do
|
104
|
+
expect(->{ PensioAPI::Transaction.find }).to raise_error(PensioAPI::Errors::GatewayError)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'with incomplete credentials' do
|
109
|
+
before :each do
|
110
|
+
PensioAPI::Credentials = OpenStruct.new({
|
111
|
+
base_uri: nil,
|
112
|
+
username: nil,
|
113
|
+
password: nil
|
114
|
+
})
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'raises a PensioAPI::Errors::NoCredentials error' do
|
118
|
+
expect(->{ PensioAPI::Transaction.find }).to raise_error(PensioAPI::Errors::NoCredentials)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Reservation do
|
4
|
+
before :each do
|
5
|
+
stub_pensio_response('/merchant/API/payments', 'payments')
|
6
|
+
stub_pensio_response('/merchant/API/captureReservation', 'capture_reservation')
|
7
|
+
stub_pensio_response('/merchant/API/releaseReservation', 'release_reservation')
|
8
|
+
stub_pensio_response('/merchant/API/reservationOfFixedAmount', 'reservation_of_fixed_amount')
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:transaction) { PensioAPI::Transaction.find.first }
|
12
|
+
|
13
|
+
describe '.capture' do
|
14
|
+
let(:response) { transaction.to_reservation.capture }
|
15
|
+
|
16
|
+
specify { expect(response).to be_an_instance_of(PensioAPI::Responses::ReservationCapture) }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '.release' do
|
20
|
+
let(:response) { transaction.to_reservation.release }
|
21
|
+
|
22
|
+
specify { expect(response).to be_an_instance_of(PensioAPI::Responses::ReservationRelease) }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '.of_fixed_amount' do
|
26
|
+
let(:response) do
|
27
|
+
PensioAPI::Reservation.of_fixed_amount(reservation_arguments)
|
28
|
+
end
|
29
|
+
|
30
|
+
specify { expect(response).to be_an_instance_of(PensioAPI::Responses::Reservation) }
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::Base do
|
4
|
+
let(:test_data) do
|
5
|
+
OpenStruct.new({
|
6
|
+
body: {
|
7
|
+
"Result" => "Success",
|
8
|
+
"TransactionId" => 1234,
|
9
|
+
"Amount" => 543.21
|
10
|
+
},
|
11
|
+
headers: {
|
12
|
+
"ErrorMessage" => nil,
|
13
|
+
"ErrorCode" => "0"
|
14
|
+
}
|
15
|
+
})
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:response_object) { PensioAPI::Responses::Base.new(test_data) }
|
19
|
+
let(:transaction) { PensioAPI::Transaction.new(test_data) }
|
20
|
+
|
21
|
+
describe '.raw' do
|
22
|
+
it 'provides a reader for the response object' do
|
23
|
+
expect(response_object.raw).to eq(test_data.body)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'method calls' do
|
28
|
+
it 'makes the individual response attributes available' do
|
29
|
+
expect(response_object.amount).to eq(test_data.body['Amount'])
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'with a snake_case method name' do
|
33
|
+
it 'converts to CamelCase' do
|
34
|
+
expect(response_object.transaction_id).to eq(1234)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '.success?' do
|
40
|
+
context 'with a successful response' do
|
41
|
+
context 'with success specified in the response body' do
|
42
|
+
it 'returns true' do
|
43
|
+
expect(response_object.success?).to be_true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'with success unspecified in the response body' do
|
48
|
+
let(:test_data) do
|
49
|
+
OpenStruct.new({
|
50
|
+
body: {
|
51
|
+
"TransactionId" => 1234,
|
52
|
+
"Amount" => 543.21
|
53
|
+
},
|
54
|
+
headers: {
|
55
|
+
"ErrorMessage" => nil,
|
56
|
+
"ErrorCode" => "0"
|
57
|
+
}
|
58
|
+
})
|
59
|
+
end
|
60
|
+
let(:response_object) { PensioAPI::Responses::Base.new(test_data) }
|
61
|
+
|
62
|
+
it 'returns true' do
|
63
|
+
expect(response_object.success?).to be_true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::FundingList do
|
4
|
+
let(:funding_list) { PensioAPI::FundingList.all }
|
5
|
+
|
6
|
+
before :each do
|
7
|
+
stub_pensio_response('/merchant/API/fundingList', 'funding_list')
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'reader attributes' do
|
11
|
+
describe '.funding_lists' do
|
12
|
+
it 'is an array of PensioAPI::FundingList objects' do
|
13
|
+
expect(funding_list.funding_lists.map(&:class).uniq).to eq([PensioAPI::FundingList])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.page_count' do
|
18
|
+
it 'returns a number of pages' do
|
19
|
+
expect(funding_list.page_count).to be_an_instance_of(Fixnum)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::GatewayURL do
|
4
|
+
before :each do
|
5
|
+
stub_pensio_response('/merchant/API/createPaymentRequest', 'create_payment_request')
|
6
|
+
end
|
7
|
+
|
8
|
+
let (:gateway_url_response) { PensioAPI::Ecommerce.create_payment_request(reservation_arguments) }
|
9
|
+
|
10
|
+
describe 'getter attributes' do
|
11
|
+
describe '.url' do
|
12
|
+
it 'exposes the URL' do
|
13
|
+
expect(gateway_url_response.url).to eq(gateway_url_response.raw['Url'])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::Refund do
|
4
|
+
before :each do
|
5
|
+
stub_pensio_response('/merchant/API/payments', 'payments')
|
6
|
+
stub_pensio_response('/merchant/API/refundCapturedReservation', 'refund_captured_reservation')
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:response) { PensioAPI::Transaction.find.first.refund }
|
10
|
+
|
11
|
+
specify { expect(response).to be_an_instance_of(PensioAPI::Responses::Refund) }
|
12
|
+
|
13
|
+
describe 'readable attributes' do
|
14
|
+
specify { expect(response.transaction).to be_an_instance_of(PensioAPI::Transaction) }
|
15
|
+
specify { expect(response.refund_amount).to eq(BigDecimal.new('0.12')) }
|
16
|
+
specify { expect(response.refund_currency).to eq(978) }
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::ReservationCapture do
|
4
|
+
before :each do
|
5
|
+
stub_pensio_response('/merchant/API/payments', 'payments')
|
6
|
+
stub_pensio_response('/merchant/API/captureReservation', 'capture_reservation')
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:response) { PensioAPI::Transaction.find.first.to_reservation.capture }
|
10
|
+
|
11
|
+
specify { expect(response).to be_an_instance_of(PensioAPI::Responses::ReservationCapture) }
|
12
|
+
|
13
|
+
describe 'readable attributes' do
|
14
|
+
specify { expect(response.transaction).to be_an_instance_of(PensioAPI::Transaction) }
|
15
|
+
specify { expect(response.capture_amount).to eq(BigDecimal.new('0.20')) }
|
16
|
+
specify { expect(response.capture_currency).to eq(978) }
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::ReservationRelease do
|
4
|
+
before :each do
|
5
|
+
stub_pensio_response('/merchant/API/payments', 'payments')
|
6
|
+
stub_pensio_response('/merchant/API/releaseReservation', 'release_reservation')
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:response) { PensioAPI::Transaction.find.first.to_reservation.release }
|
10
|
+
|
11
|
+
specify { expect(response).to be_an_instance_of(PensioAPI::Responses::ReservationRelease) }
|
12
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::Reservation do
|
4
|
+
before :each do
|
5
|
+
stub_pensio_response('/merchant/API/reservationOfFixedAmount', 'reservation_of_fixed_amount')
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:response) { PensioAPI::Reservation.of_fixed_amount(reservation_arguments) }
|
9
|
+
|
10
|
+
specify { expect(response).to be_an_instance_of(PensioAPI::Responses::Reservation) }
|
11
|
+
|
12
|
+
describe 'readable attributes' do
|
13
|
+
specify { expect(response.transaction).to be_an_instance_of(PensioAPI::Transaction) }
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::SubscriptionCharge do
|
4
|
+
before :each do
|
5
|
+
stub_pensio_response('/merchant/API/payments', 'payments')
|
6
|
+
stub_pensio_response('/merchant/API/chargeSubscription', 'charge_subscription')
|
7
|
+
stub_pensio_response('/merchant/API/reserveSubscriptionCharge', 'reserve_subscription_charge')
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:response) { PensioAPI::Transaction.find.first.to_subscription.charge }
|
11
|
+
let(:uncharged_response) { PensioAPI::Transaction.find.first.to_subscription.reserve_charge }
|
12
|
+
|
13
|
+
specify { expect(response).to be_an_instance_of(PensioAPI::Responses::SubscriptionCharge) }
|
14
|
+
|
15
|
+
describe '.existing' do
|
16
|
+
specify { expect(response.existing).to be_an_instance_of(PensioAPI::Transaction) }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '.new' do
|
20
|
+
specify { expect(response.new).to be_an_instance_of(PensioAPI::Transaction) }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '.each' do
|
24
|
+
let(:enumerator) { response.to_enum }
|
25
|
+
|
26
|
+
specify { expect(enumerator.count).to eq(2) }
|
27
|
+
|
28
|
+
it 'yields the existing transaction first' do
|
29
|
+
expect(enumerator.next).to eq(response.existing)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'yields the new transaction second' do
|
33
|
+
enumerator.next
|
34
|
+
expect(enumerator.next).to eq(response.new)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '.captured?' do
|
39
|
+
it 'delegates .captured? to the new transaction' do
|
40
|
+
response.new.should_receive(:captured?)
|
41
|
+
response.captured?
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'with a reserved charge' do
|
45
|
+
it 'returns false' do
|
46
|
+
expect(uncharged_response).to_not be_captured
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'with a captured charge' do
|
51
|
+
it 'returns true' do
|
52
|
+
expect(response).to be_captured
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::SubscriptionFailureCallback do
|
4
|
+
|
5
|
+
let(:response) { PensioAPI::Callback.parse_failure(file_fixture("subscription_failure_callback.xml")) }
|
6
|
+
|
7
|
+
it "succeeds" do
|
8
|
+
expect(response.success?).to be_true
|
9
|
+
end
|
10
|
+
|
11
|
+
describe ".reservation" do
|
12
|
+
it "gets a reservation transaction" do
|
13
|
+
expect(response.reservation).to be_an_instance_of(PensioAPI::Transaction)
|
14
|
+
end
|
15
|
+
it "is not reserved" do
|
16
|
+
expect(response.reservation).to_not be_reserved
|
17
|
+
end
|
18
|
+
it "attempted to reserve a non-zero amount" do
|
19
|
+
expect(response.reservation.reserved_amount).to be > 0.0
|
20
|
+
end
|
21
|
+
it "does not capture any amount" do
|
22
|
+
expect(response.reservation.captured_amount).to eq 0.0
|
23
|
+
end
|
24
|
+
it "receives the submitted billing address" do
|
25
|
+
expect(response.reservation.billing_address).to be_an_instance_of PensioAPI::BillingAddress
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe ".charge" do
|
30
|
+
it "gets a charge transaction" do
|
31
|
+
expect(response.charge).to be_an_instance_of(PensioAPI::Transaction)
|
32
|
+
end
|
33
|
+
it "is not captured" do
|
34
|
+
expect(response.reservation).to_not be_captured
|
35
|
+
end
|
36
|
+
it "does not reserve any amount" do
|
37
|
+
expect(response.charge.reserved_amount).to eq 0.0
|
38
|
+
end
|
39
|
+
it "does not capture any amount" do
|
40
|
+
expect(response.charge.captured_amount).to eq 0.0
|
41
|
+
end
|
42
|
+
it "receives the submitted billing address" do
|
43
|
+
expect(response.charge.billing_address).to be_an_instance_of PensioAPI::BillingAddress
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::SuccessCallback do
|
4
|
+
|
5
|
+
let(:response) { PensioAPI::Callback.parse_success(file_fixture("success_callback.xml")) }
|
6
|
+
|
7
|
+
it "succeeds" do
|
8
|
+
expect(response.success?).to be_true
|
9
|
+
end
|
10
|
+
|
11
|
+
describe ".reservation" do
|
12
|
+
it "gets a reservation transaction" do
|
13
|
+
expect(response.reservation).to be_an_instance_of(PensioAPI::Transaction)
|
14
|
+
end
|
15
|
+
it "is reserved" do
|
16
|
+
expect(response.reservation).to be_reserved
|
17
|
+
end
|
18
|
+
it "reserves a non-zero amount" do
|
19
|
+
expect(response.reservation.reserved_amount).to be > 0.0
|
20
|
+
end
|
21
|
+
it "does not capture any amount" do
|
22
|
+
expect(response.reservation.captured_amount).to eq 0.0
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe ".charge" do
|
27
|
+
it "gets a charge transaction" do
|
28
|
+
expect(response.charge).to be_an_instance_of(PensioAPI::Transaction)
|
29
|
+
end
|
30
|
+
it "is captured" do
|
31
|
+
expect(response.charge).to be_captured
|
32
|
+
end
|
33
|
+
it "reserves a non-zero amount" do
|
34
|
+
expect(response.charge.reserved_amount).to be > 0.0
|
35
|
+
end
|
36
|
+
it "captures a non-zero amount" do
|
37
|
+
expect(response.charge.captured_amount).to be > 0.0
|
38
|
+
end
|
39
|
+
it "captures the same amount as was reserved" do
|
40
|
+
expect(response.charge.reserved_amount).to eq(response.charge.captured_amount)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::Terminal do
|
4
|
+
before :each do
|
5
|
+
stub_pensio_response('/merchant/API/getTerminals', 'get_terminals')
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:response) { PensioAPI::Terminal.all }
|
9
|
+
|
10
|
+
describe 'object mapping' do
|
11
|
+
it 'maps terminals to terminal objects' do
|
12
|
+
expect(response.terminals.all? { |r| r.class == PensioAPI::Terminal }).to be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
specify { expect(response.terminals.length).to eq(2) }
|
16
|
+
|
17
|
+
describe '.map_terminals' do
|
18
|
+
context 'with one terminal' do
|
19
|
+
before :each do
|
20
|
+
stub_pensio_response('/merchant/API/getTerminals', 'get_terminals_single')
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:response) { PensioAPI::Terminal.all }
|
24
|
+
|
25
|
+
specify { expect(response.terminals.length).to eq(1) }
|
26
|
+
specify { expect(response.terminals.map(&:class)).to eq([PensioAPI::Terminal]) }
|
27
|
+
|
28
|
+
it 'returns the terminal inside an array' do
|
29
|
+
expect(response.terminals).to be_an_instance_of(Array)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'with more than one terminal' do
|
34
|
+
specify { expect(response.terminals.length).to eq(2) }
|
35
|
+
specify { expect(response.terminals.map(&:class).uniq).to eq([PensioAPI::Terminal]) }
|
36
|
+
|
37
|
+
it 'returns an array' do
|
38
|
+
expect(response.terminals).to be_an_instance_of(Array)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'with no terminals' do
|
45
|
+
before :each do
|
46
|
+
stub_pensio_response('/merchant/API/getTerminals', 'get_terminals_none')
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '.transactions' do
|
50
|
+
it 'returns an empty array' do
|
51
|
+
expect(response.terminals).to eq([])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Responses::Transaction do
|
4
|
+
before :each do
|
5
|
+
stub_pensio_response('/merchant/API/payments', 'payments')
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:response) { PensioAPI::Transaction.find }
|
9
|
+
|
10
|
+
describe 'object mapping' do
|
11
|
+
it 'maps transactions to transaction objects' do
|
12
|
+
expect(response.transactions.all? { |r| r.class == PensioAPI::Transaction }).to be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
specify { expect(response.transactions.length).to eq(1) }
|
16
|
+
|
17
|
+
describe '.map_transactions' do
|
18
|
+
context 'with one transaction' do
|
19
|
+
|
20
|
+
specify { expect(response.transactions.length).to eq(1) }
|
21
|
+
specify { expect(response.transactions.map(&:class)).to eq([PensioAPI::Transaction]) }
|
22
|
+
|
23
|
+
it 'returns the transaction inside an array' do
|
24
|
+
expect(response.transactions).to be_an_instance_of(Array)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'with more than one transaction' do
|
29
|
+
before :each do
|
30
|
+
stub_pensio_response('/merchant/API/payments', 'multiple_payments')
|
31
|
+
end
|
32
|
+
|
33
|
+
let(:response) { PensioAPI::Transaction.find }
|
34
|
+
|
35
|
+
specify { expect(response.transactions.length).to eq(2) }
|
36
|
+
specify { expect(response.transactions.map(&:class).uniq).to eq([PensioAPI::Transaction]) }
|
37
|
+
|
38
|
+
it 'returns an array' do
|
39
|
+
expect(response.transactions).to be_an_instance_of(Array)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'with no payments' do
|
46
|
+
before :each do
|
47
|
+
stub_pensio_response('/merchant/API/payments', 'payments_none')
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '.transactions' do
|
51
|
+
it 'returns an empty array' do
|
52
|
+
expect(response.transactions).to eq([])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Subscription do
|
4
|
+
before :each do
|
5
|
+
stub_pensio_response('/merchant/API/payments', 'payments')
|
6
|
+
stub_pensio_response('/merchant/API/setupSubscription', 'setup_subscription')
|
7
|
+
stub_pensio_response('/merchant/API/chargeSubscription', 'charge_subscription')
|
8
|
+
stub_pensio_response('/merchant/API/reserveSubscriptionCharge', 'reserve_subscription_charge')
|
9
|
+
end
|
10
|
+
|
11
|
+
# Immediate evaluation ensures that expectations receive the right arguments
|
12
|
+
let!(:subscription) { PensioAPI::Transaction.find.first.to_subscription }
|
13
|
+
|
14
|
+
describe '.setup' do
|
15
|
+
it 'returns an instance of PensioAPI::Transaction' do
|
16
|
+
expect(PensioAPI::Subscription.setup(credit_card_token: '1234')).to be_an_instance_of(PensioAPI::Transaction)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.charge' do
|
21
|
+
it 'returns an instance of PensioAPI::Responses::SubscriptionCharge' do
|
22
|
+
expect(subscription.charge).to be_an_instance_of(PensioAPI::Responses::SubscriptionCharge)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '.reserve_charge' do
|
27
|
+
it 'returns an instance of PensioAPI::Responses::SubscriptionCharge' do
|
28
|
+
expect(subscription.reserve_charge).to be_an_instance_of(PensioAPI::Responses::SubscriptionCharge)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'subscription_options' do
|
33
|
+
it 'wraps transaction_id' do
|
34
|
+
expect(subscription.send(:subscription_options)[:transaction_id]).to eq('1')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PensioAPI::Terminal do
|
4
|
+
before :each do
|
5
|
+
stub_pensio_response('/merchant/API/getTerminals', 'get_terminals')
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '.all' do
|
9
|
+
let(:response) { PensioAPI::Terminal.all }
|
10
|
+
|
11
|
+
specify { expect(response.terminals.length).to eq(2) }
|
12
|
+
|
13
|
+
it 'maps the response to terminal objects' do
|
14
|
+
terminal_classes = response.terminals.map(&:class).uniq
|
15
|
+
expect(terminal_classes).to eq([PensioAPI::Terminal])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|