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.
Files changed (89) hide show
  1. checksums.yaml +13 -5
  2. data/.rspec +2 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +83 -0
  5. data/Guardfile +23 -0
  6. data/LICENSE +24 -0
  7. data/README.md +77 -0
  8. data/lib/pensio_api/billing_address.rb +15 -0
  9. data/lib/pensio_api/callback.rb +30 -0
  10. data/lib/pensio_api/credentials.rb +7 -0
  11. data/lib/pensio_api/ecommerce.rb +13 -0
  12. data/lib/pensio_api/errors/bad_request.rb +15 -0
  13. data/lib/pensio_api/errors/gateway_error.rb +21 -0
  14. data/lib/pensio_api/errors/no_credentials.rb +9 -0
  15. data/lib/pensio_api/funding_list.rb +30 -0
  16. data/lib/pensio_api/funding_list_request.rb +15 -0
  17. data/lib/pensio_api/mixins/has_transactions.rb +36 -0
  18. data/lib/pensio_api/mixins/id.rb +9 -0
  19. data/lib/pensio_api/mixins/method_missing.rb +9 -0
  20. data/lib/pensio_api/mixins/request_defaults.rb +50 -0
  21. data/lib/pensio_api/mixins/timestamps.rb +13 -0
  22. data/lib/pensio_api/request.rb +18 -0
  23. data/lib/pensio_api/reservation.rb +28 -0
  24. data/lib/pensio_api/responses/base.rb +32 -0
  25. data/lib/pensio_api/responses/funding_list.rb +43 -0
  26. data/lib/pensio_api/responses/gateway_url.rb +13 -0
  27. data/lib/pensio_api/responses/refund.rb +17 -0
  28. data/lib/pensio_api/responses/reservation.rb +15 -0
  29. data/lib/pensio_api/responses/reservation_capture.rb +14 -0
  30. data/lib/pensio_api/responses/reservation_release.rb +6 -0
  31. data/lib/pensio_api/responses/subscription_charge.rb +21 -0
  32. data/lib/pensio_api/responses/subscription_failure_callback.rb +21 -0
  33. data/lib/pensio_api/responses/success_callback.rb +21 -0
  34. data/lib/pensio_api/responses/terminal.rb +41 -0
  35. data/lib/pensio_api/responses/transaction.rb +13 -0
  36. data/lib/pensio_api/subscription.rb +30 -0
  37. data/lib/pensio_api/terminal.rb +17 -0
  38. data/lib/pensio_api/transaction.rb +84 -0
  39. data/lib/pensio_api.rb +36 -0
  40. data/pensio_api.gemspec +20 -0
  41. data/spec/lib/pensio_api/billing_address_spec.rb +40 -0
  42. data/spec/lib/pensio_api/callback_spec.rb +21 -0
  43. data/spec/lib/pensio_api/ecommerce_spec.rb +22 -0
  44. data/spec/lib/pensio_api/errors/bad_request_spec.rb +31 -0
  45. data/spec/lib/pensio_api/errors/gateway_error_spec.rb +38 -0
  46. data/spec/lib/pensio_api/funding_list_request_spec.rb +17 -0
  47. data/spec/lib/pensio_api/funding_list_spec.rb +38 -0
  48. data/spec/lib/pensio_api/request_spec.rb +122 -0
  49. data/spec/lib/pensio_api/reservation_spec.rb +32 -0
  50. data/spec/lib/pensio_api/responses/base_spec.rb +68 -0
  51. data/spec/lib/pensio_api/responses/funding_list_spec.rb +23 -0
  52. data/spec/lib/pensio_api/responses/gateway_url_spec.rb +17 -0
  53. data/spec/lib/pensio_api/responses/refund_spec.rb +18 -0
  54. data/spec/lib/pensio_api/responses/reservation_capture_spec.rb +18 -0
  55. data/spec/lib/pensio_api/responses/reservation_release_spec.rb +12 -0
  56. data/spec/lib/pensio_api/responses/reservation_spec.rb +15 -0
  57. data/spec/lib/pensio_api/responses/subscription_charge_spec.rb +56 -0
  58. data/spec/lib/pensio_api/responses/subscription_failure_callback_spec.rb +48 -0
  59. data/spec/lib/pensio_api/responses/success_callback_spec.rb +45 -0
  60. data/spec/lib/pensio_api/responses/terminal_spec.rb +55 -0
  61. data/spec/lib/pensio_api/responses/transaction_spec.rb +56 -0
  62. data/spec/lib/pensio_api/subscription_spec.rb +37 -0
  63. data/spec/lib/pensio_api/terminal_spec.rb +18 -0
  64. data/spec/lib/pensio_api/transaction_spec.rb +101 -0
  65. data/spec/spec_helper.rb +26 -0
  66. data/spec/support/fixtures/bad_request_error.xml +10 -0
  67. data/spec/support/fixtures/capture_reservation.xml +84 -0
  68. data/spec/support/fixtures/charge_subscription.xml +89 -0
  69. data/spec/support/fixtures/create_multi_payment_request.xml +13 -0
  70. data/spec/support/fixtures/create_payment_request.xml +13 -0
  71. data/spec/support/fixtures/failure_callback.xml +76 -0
  72. data/spec/support/fixtures/funding_download.csv +6 -0
  73. data/spec/support/fixtures/funding_list.xml +43 -0
  74. data/spec/support/fixtures/get_terminals.xml +38 -0
  75. data/spec/support/fixtures/get_terminals_none.xml +12 -0
  76. data/spec/support/fixtures/get_terminals_single.xml +28 -0
  77. data/spec/support/fixtures/multiple_payments.xml +146 -0
  78. data/spec/support/fixtures/payments.xml +80 -0
  79. data/spec/support/fixtures/payments_none.xml +13 -0
  80. data/spec/support/fixtures/pensio_error.xml +48 -0
  81. data/spec/support/fixtures/refund_captured_reservation.xml +88 -0
  82. data/spec/support/fixtures/release_reservation.xml +72 -0
  83. data/spec/support/fixtures/reservation_of_fixed_amount.xml +46 -0
  84. data/spec/support/fixtures/reserve_subscription_charge.xml +86 -0
  85. data/spec/support/fixtures/setup_subscription.xml +46 -0
  86. data/spec/support/fixtures/subscription_failure_callback.xml +132 -0
  87. data/spec/support/fixtures/success_callback.xml +119 -0
  88. data/spec/support/helpers.rb +38 -0
  89. 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