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,17 @@
1
+ module PensioAPI
2
+ module Responses
3
+ class Refund < Base
4
+ attr_reader :transaction, :refund_amount, :refund_currency
5
+
6
+ def initialize(request)
7
+ super(request)
8
+
9
+ @transaction = PensioAPI::Transaction.new(
10
+ transactions['Transaction']
11
+ )
12
+ @refund_amount = BigDecimal.new(@raw['RefundedAmount'])
13
+ @refund_currency = @raw['RefundCurrency'].to_i
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module PensioAPI
2
+ module Responses
3
+ class Reservation < Base
4
+ attr_reader :transaction
5
+
6
+ def initialize(request)
7
+ super(request)
8
+
9
+ @transaction = PensioAPI::Transaction.new(
10
+ transactions['Transaction']
11
+ )
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ module PensioAPI
2
+ module Responses
3
+ class ReservationCapture < Responses::Reservation
4
+ attr_reader :capture_amount, :capture_currency
5
+
6
+ def initialize(request)
7
+ super(request)
8
+
9
+ @capture_amount = BigDecimal.new(@raw['CaptureAmount'])
10
+ @capture_currency = @raw['CaptureCurrency'].to_i
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ module PensioAPI
2
+ module Responses
3
+ class ReservationRelease < Responses::Reservation
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,21 @@
1
+ module PensioAPI
2
+ module Responses
3
+ class SubscriptionCharge < Responses::Transaction
4
+ extend Forwardable
5
+
6
+ def_delegators :new, :captured?
7
+
8
+ def each
9
+ [existing, new].each { |t| yield t }
10
+ end
11
+
12
+ def existing
13
+ @transactions.first
14
+ end
15
+
16
+ def new
17
+ @transactions.last
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module PensioAPI
2
+ module Responses
3
+ class SubscriptionFailureCallback < Transaction
4
+ extend Forwardable
5
+
6
+ def_delegators :new, :captured?
7
+
8
+ def each
9
+ [reservation, charge].each { |t| yield t }
10
+ end
11
+
12
+ def reservation
13
+ @transactions.first
14
+ end
15
+
16
+ def charge
17
+ @transactions.last
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module PensioAPI
2
+ module Responses
3
+ class SuccessCallback < Transaction
4
+ extend Forwardable
5
+
6
+ def_delegators :new, :captured?
7
+
8
+ def each
9
+ [reservation, charge].each { |t| yield t }
10
+ end
11
+
12
+ def reservation
13
+ @transactions.first
14
+ end
15
+
16
+ def charge
17
+ @transactions.last
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,41 @@
1
+ module PensioAPI
2
+ module Responses
3
+ class Terminal < Base
4
+ include Enumerable
5
+
6
+ attr_reader :terminals
7
+
8
+ def initialize(request)
9
+ super(request)
10
+
11
+ map_terminals
12
+ end
13
+
14
+ def each
15
+ @terminals.each { |t| yield t }
16
+ end
17
+
18
+ def last
19
+ @terminals.last
20
+ end
21
+
22
+ private
23
+
24
+ def map_terminals
25
+ @terminals = if raw_terminals.is_a?(Array)
26
+ raw_terminals.map { |t| PensioAPI::Terminal.new(t) }
27
+ else
28
+ [PensioAPI::Terminal.new(raw_terminals)]
29
+ end
30
+ end
31
+
32
+ def raw_terminals
33
+ @raw_terminals ||= if @raw['Terminals']
34
+ @raw['Terminals']['Terminal']
35
+ else
36
+ []
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,13 @@
1
+ module PensioAPI
2
+ module Responses
3
+ class Transaction < Base
4
+ include Mixins::HasTransactions
5
+
6
+ def initialize(request)
7
+ super(request)
8
+
9
+ map_transactions
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ module PensioAPI
2
+ class Subscription
3
+ def self.setup(options={})
4
+ request = Request.new('/merchant/API/setupSubscription', options)
5
+ if request.response_contains?('Transactions')
6
+ Transaction.new(request.body['Transactions']['Transaction'])
7
+ end
8
+ end
9
+
10
+ def initialize(transaction)
11
+ @transaction = transaction
12
+ end
13
+
14
+ def charge(options={})
15
+ request = Request.new('/merchant/API/chargeSubscription', options.merge(subscription_options))
16
+ Responses::SubscriptionCharge.new(request)
17
+ end
18
+
19
+ def reserve_charge(options={})
20
+ request = Request.new('/merchant/API/reserveSubscriptionCharge', options.merge(subscription_options))
21
+ Responses::SubscriptionCharge.new(request)
22
+ end
23
+
24
+ private
25
+
26
+ def subscription_options
27
+ { transaction_id: @transaction.id }
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,17 @@
1
+ module PensioAPI
2
+ class Terminal
3
+ include Mixins::MethodMissing
4
+
5
+ attr_reader :title
6
+
7
+ def self.all
8
+ request = Request.new('/merchant/API/getTerminals')
9
+ Responses::Terminal.new(request)
10
+ end
11
+
12
+ def initialize(terminal_body)
13
+ @raw = terminal_body
14
+ @title = @raw['Title']
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,84 @@
1
+ module PensioAPI
2
+ class Transaction
3
+ include Mixins::ID
4
+ include Mixins::MethodMissing
5
+ include Mixins::Timestamps
6
+
7
+ attr_reader :status
8
+ attr_reader :captured_amount
9
+ attr_reader :reserved_amount
10
+ attr_reader :refunded_amount
11
+ attr_reader :recurring_default_amount
12
+ attr_reader :card_status
13
+ attr_reader :card_token
14
+ attr_reader :card_masked_pan
15
+ attr_reader :order_id
16
+ attr_reader :merchant_currency
17
+ attr_reader :card_holder_currency
18
+
19
+ # constants for transaction statuses
20
+ STATUS_RECURRING_CONFIRMED = 'recurring_confirmed'
21
+ STATUS_RELEASED = 'released'
22
+ STATUS_CAPTURED = 'captured'
23
+ STATUS_CAPTURED_FAILED = 'captured_failed'
24
+
25
+ RESERVATION_SUCCESS_STATUSES = [STATUS_RECURRING_CONFIRMED]
26
+ CHARGE_SUCCESS_STATUSES = [STATUS_CAPTURED]
27
+
28
+ def initialize(transaction_body)
29
+ @raw = transaction_body
30
+
31
+ @status = @raw['TransactionStatus']
32
+
33
+ @captured_amount = BigDecimal.new(@raw['CapturedAmount'])
34
+ @reserved_amount = BigDecimal.new(@raw['ReservedAmount'])
35
+ @refunded_amount = BigDecimal.new(@raw['RefundedAmount'])
36
+ @recurring_default_amount = BigDecimal.new(@raw['RecurringDefaultAmount'])
37
+
38
+ @card_status = @raw['CardStatus']
39
+ @card_token = @raw['CreditCardToken']
40
+ @card_masked_pan = @raw['CreditCardMaskedPan']
41
+
42
+ @order_id = @raw['ShopOrderId']
43
+
44
+ @merchant_currency = @raw['MerchantCurrency'].to_i
45
+ @card_holder_currency = @raw['CardHolderCurrency'].to_i
46
+ end
47
+
48
+ def self.find(options={})
49
+ request = Request.new('/merchant/API/payments', options)
50
+ Responses::Transaction.new(request)
51
+ end
52
+
53
+ def captured?
54
+ captured_amount >= reserved_amount && CHARGE_SUCCESS_STATUSES.include?(self.transaction_status)
55
+ end
56
+
57
+ def reserved?
58
+ RESERVATION_SUCCESS_STATUSES.include?(self.transaction_status)
59
+ end
60
+
61
+ def to_reservation
62
+ Reservation.new(self)
63
+ end
64
+
65
+ def to_subscription
66
+ Subscription.new(self)
67
+ end
68
+
69
+ def refund(options={})
70
+ request = Request.new('/merchant/API/refundCapturedReservation', options.merge(transaction_id: self.id))
71
+ Responses::Refund.new(request)
72
+ end
73
+
74
+ def terminal
75
+ @terminal ||= Terminal.all.find { |t| t.title == @raw['Terminal'] }
76
+ end
77
+
78
+ def billing_address
79
+ @billing_address ||= if @raw.has_key?('CustomerInfo') && @raw['CustomerInfo'].has_key?('BillingAddress')
80
+ BillingAddress.new(@raw['CustomerInfo']['BillingAddress'])
81
+ end
82
+ end
83
+ end
84
+ end
data/lib/pensio_api.rb ADDED
@@ -0,0 +1,36 @@
1
+ require 'active_support/core_ext/string/inflections'
2
+
3
+ require 'pensio_api/mixins/id'
4
+ require 'pensio_api/mixins/has_transactions'
5
+ require 'pensio_api/mixins/method_missing'
6
+ require 'pensio_api/mixins/request_defaults'
7
+ require 'pensio_api/mixins/timestamps'
8
+
9
+ require 'pensio_api/billing_address'
10
+ require 'pensio_api/callback'
11
+ require 'pensio_api/credentials'
12
+ require 'pensio_api/ecommerce'
13
+ require 'pensio_api/funding_list'
14
+ require 'pensio_api/funding_list_request'
15
+ require 'pensio_api/request'
16
+ require 'pensio_api/reservation'
17
+ require 'pensio_api/transaction'
18
+ require 'pensio_api/terminal'
19
+ require 'pensio_api/subscription'
20
+
21
+ require 'pensio_api/errors/bad_request'
22
+ require 'pensio_api/errors/gateway_error'
23
+ require 'pensio_api/errors/no_credentials'
24
+
25
+ require 'pensio_api/responses/base'
26
+ require 'pensio_api/responses/funding_list'
27
+ require 'pensio_api/responses/gateway_url'
28
+ require 'pensio_api/responses/terminal'
29
+ require 'pensio_api/responses/transaction'
30
+ require 'pensio_api/responses/refund'
31
+ require 'pensio_api/responses/reservation'
32
+ require 'pensio_api/responses/reservation_capture'
33
+ require 'pensio_api/responses/reservation_release'
34
+ require 'pensio_api/responses/subscription_charge'
35
+ require 'pensio_api/responses/success_callback'
36
+ require 'pensio_api/responses/subscription_failure_callback'
@@ -0,0 +1,20 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'pensio_api'
3
+ s.version = '0.2.2'
4
+ s.license = 'BSD-3-Clause'
5
+ s.summary = "Provides integration for the Pensio Merchant API"
6
+ s.authors = ['Michael Sell', 'Rory Sinclair']
7
+ s.email = 'michael@asw.com'
8
+ s.files = `git ls-files`.split("\n")
9
+ s.test_files = `git ls-files -- spec/*`.split("\n")
10
+ s.require_paths = ["lib"]
11
+
12
+ s.add_development_dependency 'rspec', '>= 2.14'
13
+ s.add_development_dependency 'webmock', '~> 1.16.1'
14
+ s.add_development_dependency 'guard', '~> 2.2.5'
15
+ s.add_development_dependency 'guard-rspec', '~> 4.2.4'
16
+
17
+ s.add_dependency 'httparty', '>= 0.12.0'
18
+ s.add_dependency 'activesupport', '>= 3.2'
19
+ s.add_dependency 'multi_xml', '>= 0.5.2'
20
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe PensioAPI::BillingAddress do
4
+ before :each do
5
+ stub_pensio_response('/merchant/API/payments', 'payments')
6
+ end
7
+
8
+ let(:transaction) { PensioAPI::Transaction.find.first }
9
+ let(:billing_address) { transaction.billing_address }
10
+
11
+ describe 'reader attributes' do
12
+ describe '.first_name' do
13
+ specify { expect(billing_address.first_name).to eq(transaction.customer_info['BillingAddress']['Firstname']) }
14
+ end
15
+
16
+ describe '.last_name' do
17
+ specify { expect(billing_address.last_name).to eq(transaction.customer_info['BillingAddress']['Lastname']) }
18
+ end
19
+
20
+ describe '.street_address' do
21
+ specify { expect(billing_address.street_address).to eq(transaction.customer_info['BillingAddress']['Address']) }
22
+ end
23
+
24
+ describe '.city' do
25
+ specify { expect(billing_address.city).to eq(transaction.customer_info['BillingAddress']['City']) }
26
+ end
27
+
28
+ describe '.region' do
29
+ specify { expect(billing_address.region).to eq(transaction.customer_info['BillingAddress']['Region']) }
30
+ end
31
+
32
+ describe '.postal_code' do
33
+ specify { expect(billing_address.postal_code).to eq(transaction.customer_info['BillingAddress']['PostalCode']) }
34
+ end
35
+
36
+ describe '.country' do
37
+ specify { expect(billing_address.country).to eq(transaction.customer_info['BillingAddress']['Country']) }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe PensioAPI::Callback do
4
+
5
+ describe ".parse_success" do
6
+ let(:response) { PensioAPI::Callback.parse_success(file_fixture("success_callback.xml")) }
7
+ it "should return a SuccessCallback response" do
8
+ expect(response).to be_an_instance_of(PensioAPI::Responses::SuccessCallback)
9
+ expect(response.success?).to be_true
10
+ end
11
+ end
12
+
13
+ describe ".parse_failure" do
14
+ let(:response) { PensioAPI::Callback.parse_failure(file_fixture("subscription_failure_callback.xml")) }
15
+ it "should return a SubscriptionFailureCallback response" do
16
+ expect(response).to be_an_instance_of(PensioAPI::Responses::SubscriptionFailureCallback)
17
+ expect(response.success?).to be_true
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe PensioAPI::Ecommerce do
4
+ before :each do
5
+ stub_pensio_response('/merchant/API/createPaymentRequest', 'create_payment_request')
6
+ stub_pensio_response('/merchant/API/createMultiPaymentRequest', 'create_multi_payment_request')
7
+ end
8
+
9
+ describe '.create_payment_request' do
10
+ let(:response) { PensioAPI::Ecommerce.create_payment_request(reservation_arguments) }
11
+ it 'returns an instance of PensioAPI::Responses::GatewayURL' do
12
+ expect(response).to be_an_instance_of(PensioAPI::Responses::GatewayURL)
13
+ end
14
+ end
15
+
16
+ describe '.create_multi_payment_request' do
17
+ let(:response) { PensioAPI::Ecommerce.create_multi_payment_request(reservation_arguments) }
18
+ it 'returns an instance of PensioAPI::Responses::GatewayURL' do
19
+ expect(response).to be_an_instance_of(PensioAPI::Responses::GatewayURL)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe PensioAPI::Errors::BadRequest do
4
+ before :each do
5
+ stub_pensio_response('/merchant/API/payments', 'bad_request_error')
6
+ end
7
+
8
+ let(:error) do
9
+ begin
10
+ PensioAPI::Transaction.find
11
+ rescue PensioAPI::Errors::BadRequest => e
12
+ end
13
+ e
14
+ end
15
+
16
+ specify { expect(error).to be_an_instance_of PensioAPI::Errors::BadRequest }
17
+
18
+ describe 'getter attributes' do
19
+ describe '.request_time' do
20
+ specify { expect(error.request_time).to be_an_instance_of(Time) }
21
+ end
22
+
23
+ describe '.request_path' do
24
+ specify { expect(error.request_path).to be_an_instance_of(String) }
25
+ end
26
+
27
+ describe '.error_code' do
28
+ specify { expect(error.error_code).to be_an_instance_of(Fixnum) }
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe PensioAPI::Errors::GatewayError do
4
+ before :each do
5
+ stub_pensio_response('/merchant/API/payments', 'pensio_error')
6
+ end
7
+
8
+ let(:error) do
9
+ begin
10
+ PensioAPI::Transaction.find
11
+ rescue PensioAPI::Errors::GatewayError => e
12
+ end
13
+ e
14
+ end
15
+
16
+ specify { expect(error).to be_an_instance_of PensioAPI::Errors::GatewayError }
17
+
18
+ describe 'getter attributes' do
19
+ describe '.request_time' do
20
+ specify { expect(error.request_time).to be_an_instance_of(Time) }
21
+ end
22
+
23
+ describe '.request_path' do
24
+ specify { expect(error.request_path).to be_an_instance_of(String) }
25
+ end
26
+
27
+ describe '.error_code' do
28
+ specify { expect(error.cardholder_message).to be_an_instance_of(String) }
29
+ end
30
+ end
31
+
32
+ describe 'object mapping' do
33
+ it 'maps transactions to transaction objects' do
34
+ expect(error.transactions.all? { |r| r.class == PensioAPI::Transaction }).to be_true
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe PensioAPI::FundingListRequest do
4
+ before :each do
5
+ stub_pensio_response('/merchant/API/fundingList', 'funding_list')
6
+ stub_pensio_response("http://test_user:password@localhost/merchant.php/API/fundingDownload?id=1", 'funding_download', mime_type: 'text/csv', file_ext: 'csv', base_url: '')
7
+ end
8
+
9
+ let(:request) { PensioAPI::FundingListRequest.new(PensioAPI::FundingList.all.first.download_link) }
10
+
11
+ describe 'result' do
12
+ specify { expect(request).to respond_to(:result) }
13
+ it 'returns a parsed CSV array' do
14
+ expect(request.result.map(&:class).uniq).to eq([CSV::Row])
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe PensioAPI::FundingList do
4
+ let(:response) { PensioAPI::FundingList.all }
5
+ let(:funding_list) { PensioAPI::FundingList.all.first }
6
+
7
+ before :each do
8
+ stub_pensio_response('/merchant/API/fundingList', 'funding_list')
9
+ end
10
+
11
+ describe '.all' do
12
+ it 'returns an instance of PensioAPI::Responses::FundingList' do
13
+ expect(response).to be_an_instance_of(PensioAPI::Responses::FundingList)
14
+ end
15
+ end
16
+
17
+ describe 'reader_attributes' do
18
+ specify { expect(funding_list).to respond_to(:filename) }
19
+ specify { expect(funding_list).to respond_to(:amount) }
20
+ specify { expect(funding_list).to respond_to(:acquirer) }
21
+ specify { expect(funding_list).to respond_to(:funding_date) }
22
+ specify { expect(funding_list).to respond_to(:created_at) }
23
+ specify { expect(funding_list).to respond_to(:download_link) }
24
+
25
+ specify { expect(funding_list.funding_date).to be_an_instance_of(Date) }
26
+ specify { expect(funding_list.created_at).to be_an_instance_of(Date) }
27
+ end
28
+
29
+ describe '.download' do
30
+ before :each do
31
+ stub_pensio_response("http://test_user:password@localhost/merchant.php/API/fundingDownload?id=1", 'funding_download', mime_type: 'text/csv', file_ext: 'csv', base_url: '')
32
+ end
33
+
34
+ it 'returns an array of parsed CSV' do
35
+ expect(funding_list.download.map(&:class).uniq).to eq([CSV::Row])
36
+ end
37
+ end
38
+ end