gocardless_pro 2.24.0 → 2.25.0
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 +4 -4
- data/lib/gocardless_pro.rb +3 -0
- data/lib/gocardless_pro/client.rb +6 -1
- data/lib/gocardless_pro/resources/payer_authorisation.rb +119 -0
- data/lib/gocardless_pro/resources/payout_item.rb +4 -0
- data/lib/gocardless_pro/services/payer_authorisations_service.rb +208 -0
- data/lib/gocardless_pro/version.rb +1 -1
- data/spec/resources/payer_authorisation_spec.rb +418 -0
- data/spec/services/payer_authorisations_service_spec.rb +572 -0
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e1d21b1955fd8db168185745bd1afbd46fd7c3fa434006abf5c0e838cd7507e
|
4
|
+
data.tar.gz: ef057338fc37aa2e791ef3dcd7536a50ff55711e7d8fa5762a51d6797395cab6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c1daafd49f92798ff81c407809ecf888429f2c723801c42b49dfe4d7d7351ae818925c46d897784f798c7d4ee2c7089959594cec38ab0fc6df3472f481d0207
|
7
|
+
data.tar.gz: 78eb4cd3154aa14fe50e445cd94605fe39f91893564650948717e84356fb7d374357ecbfad08784be2c21221fc096530e85407c8a1a3eb794b2ab5d40d0024d1
|
data/lib/gocardless_pro.rb
CHANGED
@@ -77,6 +77,9 @@ require_relative 'gocardless_pro/services/mandate_import_entries_service'
|
|
77
77
|
require_relative 'gocardless_pro/resources/mandate_pdf'
|
78
78
|
require_relative 'gocardless_pro/services/mandate_pdfs_service'
|
79
79
|
|
80
|
+
require_relative 'gocardless_pro/resources/payer_authorisation'
|
81
|
+
require_relative 'gocardless_pro/services/payer_authorisations_service'
|
82
|
+
|
80
83
|
require_relative 'gocardless_pro/resources/payment'
|
81
84
|
require_relative 'gocardless_pro/services/payments_service'
|
82
85
|
|
@@ -68,6 +68,11 @@ module GoCardlessPro
|
|
68
68
|
@mandate_pdfs ||= Services::MandatePdfsService.new(@api_service)
|
69
69
|
end
|
70
70
|
|
71
|
+
# Access to the service for payer_authorisation to make API calls
|
72
|
+
def payer_authorisations
|
73
|
+
@payer_authorisations ||= Services::PayerAuthorisationsService.new(@api_service)
|
74
|
+
end
|
75
|
+
|
71
76
|
# Access to the service for payment to make API calls
|
72
77
|
def payments
|
73
78
|
@payments ||= Services::PaymentsService.new(@api_service)
|
@@ -153,7 +158,7 @@ module GoCardlessPro
|
|
153
158
|
'User-Agent' => user_agent.to_s,
|
154
159
|
'Content-Type' => 'application/json',
|
155
160
|
'GoCardless-Client-Library' => 'gocardless-pro-ruby',
|
156
|
-
'GoCardless-Client-Version' => '2.
|
161
|
+
'GoCardless-Client-Version' => '2.25.0',
|
157
162
|
},
|
158
163
|
}
|
159
164
|
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
#
|
4
|
+
# This client is automatically generated from a template and JSON schema definition.
|
5
|
+
# See https://github.com/gocardless/gocardless-pro-ruby#contributing before editing.
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'uri'
|
9
|
+
|
10
|
+
module GoCardlessPro
|
11
|
+
# A module containing classes for each of the resources in the GC Api
|
12
|
+
module Resources
|
13
|
+
# Represents an instance of a payer_authorisation resource returned from the API
|
14
|
+
|
15
|
+
# Payer Authorisation resource acts as a wrapper for creating customer, bank
|
16
|
+
# account and mandate details in a single request.
|
17
|
+
# PayerAuthorisation API enables the integrators to build their own custom
|
18
|
+
# payment pages.
|
19
|
+
#
|
20
|
+
# The process to use the Payer Authorisation API is as follows:
|
21
|
+
#
|
22
|
+
# 1. Create a Payer Authorisation, either empty or with already available
|
23
|
+
# information
|
24
|
+
# 2. Update the authorisation with additional information or fix any
|
25
|
+
# mistakes
|
26
|
+
# 3. Submit the authorisation, after the payer has reviewed their
|
27
|
+
# information
|
28
|
+
# 4. [coming soon] Redirect the payer to the verification mechanisms from
|
29
|
+
# the response of the Submit request (this will be introduced as a
|
30
|
+
# non-breaking change)
|
31
|
+
# 5. Confirm the authorisation to indicate that the resources can be
|
32
|
+
# created
|
33
|
+
#
|
34
|
+
# After the Payer Authorisation is confirmed, resources will eventually be
|
35
|
+
# created as it's an asynchronous process.
|
36
|
+
#
|
37
|
+
# To retrieve the status and ID of the linked resources you can do one of
|
38
|
+
# the following:
|
39
|
+
# <ol>
|
40
|
+
# <li> Listen to <code> payer_authorisation_completed </code> <a
|
41
|
+
# href="#appendix-webhooks"> webhook</a> (recommended)</li>
|
42
|
+
# <li> Poll the GET <a
|
43
|
+
# href="#payer-authorisations-get-a-single-payer-authorisation">
|
44
|
+
# endpoint</a></li>
|
45
|
+
# <li> Poll the GET events API
|
46
|
+
# <code>https://api.gocardless.com/events?payer_authorisation={id}&action=completed</code>
|
47
|
+
# </li>
|
48
|
+
# </ol>
|
49
|
+
#
|
50
|
+
# <p class="notice">
|
51
|
+
# Note that the `create` and `update` endpoints behave differently than
|
52
|
+
# other existing `create` and `update` endpoints. The Payer Authorisation
|
53
|
+
# is still saved if incomplete data is provided.
|
54
|
+
# We return the list of incomplete data in the `incomplete_fields` along
|
55
|
+
# with the resources in the body of the response.
|
56
|
+
# <br><br>
|
57
|
+
# The API is designed to be flexible and allows you to collect information
|
58
|
+
# in multiple steps without storing any sensitive data in the browser or in
|
59
|
+
# your servers.
|
60
|
+
# </p>
|
61
|
+
class PayerAuthorisation
|
62
|
+
attr_reader :bank_account
|
63
|
+
attr_reader :created_at
|
64
|
+
attr_reader :customer
|
65
|
+
attr_reader :id
|
66
|
+
attr_reader :incomplete_fields
|
67
|
+
attr_reader :mandate
|
68
|
+
attr_reader :status
|
69
|
+
|
70
|
+
# Initialize a payer_authorisation resource instance
|
71
|
+
# @param object [Hash] an object returned from the API
|
72
|
+
def initialize(object, response = nil)
|
73
|
+
@object = object
|
74
|
+
|
75
|
+
@bank_account = object['bank_account']
|
76
|
+
@created_at = object['created_at']
|
77
|
+
@customer = object['customer']
|
78
|
+
@id = object['id']
|
79
|
+
@incomplete_fields = object['incomplete_fields']
|
80
|
+
@links = object['links']
|
81
|
+
@mandate = object['mandate']
|
82
|
+
@status = object['status']
|
83
|
+
@response = response
|
84
|
+
end
|
85
|
+
|
86
|
+
def api_response
|
87
|
+
ApiResponse.new(@response)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Return the links that the resource has
|
91
|
+
def links
|
92
|
+
@payer_authorisation_links ||= Links.new(@links)
|
93
|
+
end
|
94
|
+
|
95
|
+
# Provides the payer_authorisation resource as a hash of all its readable attributes
|
96
|
+
def to_h
|
97
|
+
@object
|
98
|
+
end
|
99
|
+
|
100
|
+
class Links
|
101
|
+
def initialize(links)
|
102
|
+
@links = links || {}
|
103
|
+
end
|
104
|
+
|
105
|
+
def bank_account
|
106
|
+
@links['bank_account']
|
107
|
+
end
|
108
|
+
|
109
|
+
def customer
|
110
|
+
@links['customer']
|
111
|
+
end
|
112
|
+
|
113
|
+
def mandate
|
114
|
+
@links['mandate']
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
require_relative './base_service'
|
2
|
+
|
3
|
+
# encoding: utf-8
|
4
|
+
#
|
5
|
+
# This client is automatically generated from a template and JSON schema definition.
|
6
|
+
# See https://github.com/gocardless/gocardless-pro-ruby#contributing before editing.
|
7
|
+
#
|
8
|
+
|
9
|
+
module GoCardlessPro
|
10
|
+
module Services
|
11
|
+
# Service for making requests to the PayerAuthorisation endpoints
|
12
|
+
class PayerAuthorisationsService < BaseService
|
13
|
+
# Retrieves the details of a single existing Payer Authorisation. It can be used
|
14
|
+
# for polling the status of a Payer Authorisation.
|
15
|
+
# Example URL: /payer_authorisations/:identity
|
16
|
+
#
|
17
|
+
# @param identity # Unique identifier, beginning with "PA".
|
18
|
+
# @param options [Hash] parameters as a hash, under a params key.
|
19
|
+
def get(identity, options = {})
|
20
|
+
path = sub_url('/payer_authorisations/:identity', 'identity' => identity)
|
21
|
+
|
22
|
+
options[:retry_failures] = true
|
23
|
+
|
24
|
+
response = make_request(:get, path, options)
|
25
|
+
|
26
|
+
return if response.body.nil?
|
27
|
+
|
28
|
+
Resources::PayerAuthorisation.new(unenvelope_body(response.body), response)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Creates a Payer Authorisation. The resource is saved to the database even if
|
32
|
+
# incomplete. An empty array of incomplete_fields means that the resource is
|
33
|
+
# valid. The ID of the resource is used for the other actions. This endpoint has
|
34
|
+
# been designed this way so you do not need to save any payer data on your
|
35
|
+
# servers or the browser while still being able to implement a progressive
|
36
|
+
# solution, such as a multi-step form.
|
37
|
+
# Example URL: /payer_authorisations
|
38
|
+
# @param options [Hash] parameters as a hash, under a params key.
|
39
|
+
def create(options = {})
|
40
|
+
path = '/payer_authorisations'
|
41
|
+
|
42
|
+
params = options.delete(:params) || {}
|
43
|
+
options[:params] = {}
|
44
|
+
options[:params][envelope_key] = params
|
45
|
+
|
46
|
+
options[:retry_failures] = true
|
47
|
+
|
48
|
+
begin
|
49
|
+
response = make_request(:post, path, options)
|
50
|
+
|
51
|
+
# Response doesn't raise any errors until #body is called
|
52
|
+
response.tap(&:body)
|
53
|
+
rescue InvalidStateError => e
|
54
|
+
if e.idempotent_creation_conflict?
|
55
|
+
case @api_service.on_idempotency_conflict
|
56
|
+
when :raise
|
57
|
+
raise IdempotencyConflict, e.error
|
58
|
+
when :fetch
|
59
|
+
return get(e.conflicting_resource_id)
|
60
|
+
else
|
61
|
+
raise ArgumentError, 'Unknown mode for :on_idempotency_conflict'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
raise e
|
66
|
+
end
|
67
|
+
|
68
|
+
return if response.body.nil?
|
69
|
+
|
70
|
+
Resources::PayerAuthorisation.new(unenvelope_body(response.body), response)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Updates a Payer Authorisation. Updates the Payer Authorisation with the
|
74
|
+
# request data.Can be invoked as many times as needed. Only fields present in
|
75
|
+
# the request will be modified. An empty array of incomplete_fields means that
|
76
|
+
# the resource is valid. This endpoint has been designed this way so you do not
|
77
|
+
# need to save any payer data on your servers or the browser while still being
|
78
|
+
# able to implement a progressive solution, such a multi-step form. <p
|
79
|
+
# class="notice"> Note that in order to update the `metadata` attribute values
|
80
|
+
# it must be sent completely as it overrides the previously existing values.
|
81
|
+
# </p>
|
82
|
+
# Example URL: /payer_authorisations/:identity
|
83
|
+
#
|
84
|
+
# @param identity # Unique identifier, beginning with "PA".
|
85
|
+
# @param options [Hash] parameters as a hash, under a params key.
|
86
|
+
def update(identity, options = {})
|
87
|
+
path = sub_url('/payer_authorisations/:identity', 'identity' => identity)
|
88
|
+
|
89
|
+
params = options.delete(:params) || {}
|
90
|
+
options[:params] = {}
|
91
|
+
options[:params][envelope_key] = params
|
92
|
+
|
93
|
+
options[:retry_failures] = true
|
94
|
+
|
95
|
+
response = make_request(:put, path, options)
|
96
|
+
|
97
|
+
return if response.body.nil?
|
98
|
+
|
99
|
+
Resources::PayerAuthorisation.new(unenvelope_body(response.body), response)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Submits all the data previously pushed to this PayerAuthorisation for
|
103
|
+
# verification.This time, a 200 HTTP status is returned if the resource is valid
|
104
|
+
# and a 422 error response in case of validation errors. After it is
|
105
|
+
# successfully submitted, the Payer Authorisation can no longer be edited.
|
106
|
+
# Example URL: /payer_authorisations/:identity/actions/submit
|
107
|
+
#
|
108
|
+
# @param identity # Unique identifier, beginning with "PA".
|
109
|
+
# @param options [Hash] parameters as a hash, under a params key.
|
110
|
+
def submit(identity, options = {})
|
111
|
+
path = sub_url('/payer_authorisations/:identity/actions/submit', 'identity' => identity)
|
112
|
+
|
113
|
+
params = options.delete(:params) || {}
|
114
|
+
options[:params] = {}
|
115
|
+
options[:params]['data'] = params
|
116
|
+
|
117
|
+
options[:retry_failures] = false
|
118
|
+
|
119
|
+
begin
|
120
|
+
response = make_request(:post, path, options)
|
121
|
+
|
122
|
+
# Response doesn't raise any errors until #body is called
|
123
|
+
response.tap(&:body)
|
124
|
+
rescue InvalidStateError => e
|
125
|
+
if e.idempotent_creation_conflict?
|
126
|
+
case @api_service.on_idempotency_conflict
|
127
|
+
when :raise
|
128
|
+
raise IdempotencyConflict, e.error
|
129
|
+
when :fetch
|
130
|
+
return get(e.conflicting_resource_id)
|
131
|
+
else
|
132
|
+
raise ArgumentError, 'Unknown mode for :on_idempotency_conflict'
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
raise e
|
137
|
+
end
|
138
|
+
|
139
|
+
return if response.body.nil?
|
140
|
+
|
141
|
+
Resources::PayerAuthorisation.new(unenvelope_body(response.body), response)
|
142
|
+
end
|
143
|
+
|
144
|
+
# Confirms the Payer Authorisation, indicating that the resources are ready to
|
145
|
+
# be created.
|
146
|
+
# A Payer Authorisation cannot be confirmed if it hasn't been submitted yet.
|
147
|
+
#
|
148
|
+
# <p class="notice">
|
149
|
+
# The main use of the confirm endpoint is to enable integrators to acknowledge
|
150
|
+
# the end of the setup process.
|
151
|
+
# They might want to make the payers go through some other steps after they go
|
152
|
+
# through our flow or make them go through the necessary verification
|
153
|
+
# mechanism(upcomming feature).
|
154
|
+
# </p>
|
155
|
+
# Example URL: /payer_authorisations/:identity/actions/confirm
|
156
|
+
#
|
157
|
+
# @param identity # Unique identifier, beginning with "PA".
|
158
|
+
# @param options [Hash] parameters as a hash, under a params key.
|
159
|
+
def confirm(identity, options = {})
|
160
|
+
path = sub_url('/payer_authorisations/:identity/actions/confirm', 'identity' => identity)
|
161
|
+
|
162
|
+
params = options.delete(:params) || {}
|
163
|
+
options[:params] = {}
|
164
|
+
options[:params]['data'] = params
|
165
|
+
|
166
|
+
options[:retry_failures] = false
|
167
|
+
|
168
|
+
begin
|
169
|
+
response = make_request(:post, path, options)
|
170
|
+
|
171
|
+
# Response doesn't raise any errors until #body is called
|
172
|
+
response.tap(&:body)
|
173
|
+
rescue InvalidStateError => e
|
174
|
+
if e.idempotent_creation_conflict?
|
175
|
+
case @api_service.on_idempotency_conflict
|
176
|
+
when :raise
|
177
|
+
raise IdempotencyConflict, e.error
|
178
|
+
when :fetch
|
179
|
+
return get(e.conflicting_resource_id)
|
180
|
+
else
|
181
|
+
raise ArgumentError, 'Unknown mode for :on_idempotency_conflict'
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
raise e
|
186
|
+
end
|
187
|
+
|
188
|
+
return if response.body.nil?
|
189
|
+
|
190
|
+
Resources::PayerAuthorisation.new(unenvelope_body(response.body), response)
|
191
|
+
end
|
192
|
+
|
193
|
+
private
|
194
|
+
|
195
|
+
# Unenvelope the response of the body using the service's `envelope_key`
|
196
|
+
#
|
197
|
+
# @param body [Hash]
|
198
|
+
def unenvelope_body(body)
|
199
|
+
body[envelope_key] || body['data']
|
200
|
+
end
|
201
|
+
|
202
|
+
# return the key which API responses will envelope data under
|
203
|
+
def envelope_key
|
204
|
+
'payer_authorisations'
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
@@ -0,0 +1,418 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GoCardlessPro::Resources::PayerAuthorisation do
|
4
|
+
let(:client) do
|
5
|
+
GoCardlessPro::Client.new(
|
6
|
+
access_token: 'SECRET_TOKEN'
|
7
|
+
)
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:response_headers) { { 'Content-Type' => 'application/json' } }
|
11
|
+
|
12
|
+
describe '#get' do
|
13
|
+
let(:id) { 'ID123' }
|
14
|
+
|
15
|
+
subject(:get_response) { client.payer_authorisations.get(id) }
|
16
|
+
|
17
|
+
context 'passing in a custom header' do
|
18
|
+
let!(:stub) do
|
19
|
+
stub_url = '/payer_authorisations/:identity'.gsub(':identity', id)
|
20
|
+
stub_request(:get, /.*api.gocardless.com#{stub_url}/).
|
21
|
+
with(headers: { 'Foo' => 'Bar' }).
|
22
|
+
to_return(
|
23
|
+
body: {
|
24
|
+
'payer_authorisations' => {
|
25
|
+
|
26
|
+
'bank_account' => 'bank_account-input',
|
27
|
+
'created_at' => 'created_at-input',
|
28
|
+
'customer' => 'customer-input',
|
29
|
+
'id' => 'id-input',
|
30
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
31
|
+
'links' => 'links-input',
|
32
|
+
'mandate' => 'mandate-input',
|
33
|
+
'status' => 'status-input',
|
34
|
+
},
|
35
|
+
}.to_json,
|
36
|
+
headers: response_headers
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
subject(:get_response) do
|
41
|
+
client.payer_authorisations.get(id, headers: {
|
42
|
+
'Foo' => 'Bar',
|
43
|
+
})
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'includes the header' do
|
47
|
+
get_response
|
48
|
+
expect(stub).to have_been_requested
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when there is a payer_authorisation to return' do
|
53
|
+
before do
|
54
|
+
stub_url = '/payer_authorisations/:identity'.gsub(':identity', id)
|
55
|
+
stub_request(:get, /.*api.gocardless.com#{stub_url}/).to_return(
|
56
|
+
body: {
|
57
|
+
'payer_authorisations' => {
|
58
|
+
|
59
|
+
'bank_account' => 'bank_account-input',
|
60
|
+
'created_at' => 'created_at-input',
|
61
|
+
'customer' => 'customer-input',
|
62
|
+
'id' => 'id-input',
|
63
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
64
|
+
'links' => 'links-input',
|
65
|
+
'mandate' => 'mandate-input',
|
66
|
+
'status' => 'status-input',
|
67
|
+
},
|
68
|
+
}.to_json,
|
69
|
+
headers: response_headers
|
70
|
+
)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'wraps the response in a resource' do
|
74
|
+
expect(get_response).to be_a(GoCardlessPro::Resources::PayerAuthorisation)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when nothing is returned' do
|
79
|
+
before do
|
80
|
+
stub_url = '/payer_authorisations/:identity'.gsub(':identity', id)
|
81
|
+
stub_request(:get, /.*api.gocardless.com#{stub_url}/).to_return(
|
82
|
+
body: '',
|
83
|
+
headers: response_headers
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'returns nil' do
|
88
|
+
expect(get_response).to be_nil
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "when an ID is specified which can't be included in a valid URI" do
|
93
|
+
let(:id) { '`' }
|
94
|
+
|
95
|
+
it "doesn't raise an error" do
|
96
|
+
expect { get_response }.to_not raise_error(/bad URI/)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe '#create' do
|
102
|
+
subject(:post_create_response) { client.payer_authorisations.create(params: new_resource) }
|
103
|
+
context 'with a valid request' do
|
104
|
+
let(:new_resource) do
|
105
|
+
{
|
106
|
+
|
107
|
+
'bank_account' => 'bank_account-input',
|
108
|
+
'created_at' => 'created_at-input',
|
109
|
+
'customer' => 'customer-input',
|
110
|
+
'id' => 'id-input',
|
111
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
112
|
+
'links' => 'links-input',
|
113
|
+
'mandate' => 'mandate-input',
|
114
|
+
'status' => 'status-input',
|
115
|
+
}
|
116
|
+
end
|
117
|
+
|
118
|
+
before do
|
119
|
+
stub_request(:post, %r{.*api.gocardless.com/payer_authorisations}).
|
120
|
+
with(
|
121
|
+
body: {
|
122
|
+
'payer_authorisations' => {
|
123
|
+
|
124
|
+
'bank_account' => 'bank_account-input',
|
125
|
+
'created_at' => 'created_at-input',
|
126
|
+
'customer' => 'customer-input',
|
127
|
+
'id' => 'id-input',
|
128
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
129
|
+
'links' => 'links-input',
|
130
|
+
'mandate' => 'mandate-input',
|
131
|
+
'status' => 'status-input',
|
132
|
+
},
|
133
|
+
}
|
134
|
+
).
|
135
|
+
to_return(
|
136
|
+
body: {
|
137
|
+
'payer_authorisations' =>
|
138
|
+
|
139
|
+
{
|
140
|
+
|
141
|
+
'bank_account' => 'bank_account-input',
|
142
|
+
'created_at' => 'created_at-input',
|
143
|
+
'customer' => 'customer-input',
|
144
|
+
'id' => 'id-input',
|
145
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
146
|
+
'links' => 'links-input',
|
147
|
+
'mandate' => 'mandate-input',
|
148
|
+
'status' => 'status-input',
|
149
|
+
},
|
150
|
+
|
151
|
+
}.to_json,
|
152
|
+
headers: response_headers
|
153
|
+
)
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'creates and returns the resource' do
|
157
|
+
expect(post_create_response).to be_a(GoCardlessPro::Resources::PayerAuthorisation)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'with a request that returns a validation error' do
|
162
|
+
let(:new_resource) { {} }
|
163
|
+
|
164
|
+
before do
|
165
|
+
stub_request(:post, %r{.*api.gocardless.com/payer_authorisations}).to_return(
|
166
|
+
body: {
|
167
|
+
error: {
|
168
|
+
type: 'validation_failed',
|
169
|
+
code: 422,
|
170
|
+
errors: [
|
171
|
+
{ message: 'test error message', field: 'test_field' },
|
172
|
+
],
|
173
|
+
},
|
174
|
+
}.to_json,
|
175
|
+
headers: response_headers,
|
176
|
+
status: 422
|
177
|
+
)
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'throws the correct error' do
|
181
|
+
expect { post_create_response }.to raise_error(GoCardlessPro::ValidationError)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context 'with a request that returns an idempotent creation conflict error' do
|
186
|
+
let(:id) { 'ID123' }
|
187
|
+
|
188
|
+
let(:new_resource) do
|
189
|
+
{
|
190
|
+
|
191
|
+
'bank_account' => 'bank_account-input',
|
192
|
+
'created_at' => 'created_at-input',
|
193
|
+
'customer' => 'customer-input',
|
194
|
+
'id' => 'id-input',
|
195
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
196
|
+
'links' => 'links-input',
|
197
|
+
'mandate' => 'mandate-input',
|
198
|
+
'status' => 'status-input',
|
199
|
+
}
|
200
|
+
end
|
201
|
+
|
202
|
+
let!(:post_stub) do
|
203
|
+
stub_request(:post, %r{.*api.gocardless.com/payer_authorisations}).to_return(
|
204
|
+
body: {
|
205
|
+
error: {
|
206
|
+
type: 'invalid_state',
|
207
|
+
code: 409,
|
208
|
+
errors: [
|
209
|
+
{
|
210
|
+
message: 'A resource has already been created with this idempotency key',
|
211
|
+
reason: 'idempotent_creation_conflict',
|
212
|
+
links: {
|
213
|
+
conflicting_resource_id: id,
|
214
|
+
},
|
215
|
+
},
|
216
|
+
],
|
217
|
+
},
|
218
|
+
}.to_json,
|
219
|
+
headers: response_headers,
|
220
|
+
status: 409
|
221
|
+
)
|
222
|
+
end
|
223
|
+
|
224
|
+
let!(:get_stub) do
|
225
|
+
stub_url = "/payer_authorisations/#{id}"
|
226
|
+
stub_request(:get, /.*api.gocardless.com#{stub_url}/).
|
227
|
+
to_return(
|
228
|
+
body: {
|
229
|
+
'payer_authorisations' => {
|
230
|
+
|
231
|
+
'bank_account' => 'bank_account-input',
|
232
|
+
'created_at' => 'created_at-input',
|
233
|
+
'customer' => 'customer-input',
|
234
|
+
'id' => 'id-input',
|
235
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
236
|
+
'links' => 'links-input',
|
237
|
+
'mandate' => 'mandate-input',
|
238
|
+
'status' => 'status-input',
|
239
|
+
},
|
240
|
+
}.to_json,
|
241
|
+
headers: response_headers
|
242
|
+
)
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'fetches the already-created resource' do
|
246
|
+
post_create_response
|
247
|
+
expect(post_stub).to have_been_requested
|
248
|
+
expect(get_stub).to have_been_requested
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
describe '#update' do
|
254
|
+
subject(:put_update_response) { client.payer_authorisations.update(id, params: update_params) }
|
255
|
+
let(:id) { 'ABC123' }
|
256
|
+
|
257
|
+
context 'with a valid request' do
|
258
|
+
let(:update_params) { { 'hello' => 'world' } }
|
259
|
+
|
260
|
+
let!(:stub) do
|
261
|
+
stub_url = '/payer_authorisations/:identity'.gsub(':identity', id)
|
262
|
+
stub_request(:put, /.*api.gocardless.com#{stub_url}/).to_return(
|
263
|
+
body: {
|
264
|
+
'payer_authorisations' => {
|
265
|
+
|
266
|
+
'bank_account' => 'bank_account-input',
|
267
|
+
'created_at' => 'created_at-input',
|
268
|
+
'customer' => 'customer-input',
|
269
|
+
'id' => 'id-input',
|
270
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
271
|
+
'links' => 'links-input',
|
272
|
+
'mandate' => 'mandate-input',
|
273
|
+
'status' => 'status-input',
|
274
|
+
},
|
275
|
+
}.to_json,
|
276
|
+
headers: response_headers
|
277
|
+
)
|
278
|
+
end
|
279
|
+
|
280
|
+
it 'updates and returns the resource' do
|
281
|
+
expect(put_update_response).to be_a(GoCardlessPro::Resources::PayerAuthorisation)
|
282
|
+
expect(stub).to have_been_requested
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
describe '#submit' do
|
288
|
+
subject(:post_response) { client.payer_authorisations.submit(resource_id) }
|
289
|
+
|
290
|
+
let(:resource_id) { 'ABC123' }
|
291
|
+
|
292
|
+
let!(:stub) do
|
293
|
+
# /payer_authorisations/%v/actions/submit
|
294
|
+
stub_url = '/payer_authorisations/:identity/actions/submit'.gsub(':identity', resource_id)
|
295
|
+
stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
|
296
|
+
body: {
|
297
|
+
'payer_authorisations' => {
|
298
|
+
|
299
|
+
'bank_account' => 'bank_account-input',
|
300
|
+
'created_at' => 'created_at-input',
|
301
|
+
'customer' => 'customer-input',
|
302
|
+
'id' => 'id-input',
|
303
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
304
|
+
'links' => 'links-input',
|
305
|
+
'mandate' => 'mandate-input',
|
306
|
+
'status' => 'status-input',
|
307
|
+
},
|
308
|
+
}.to_json,
|
309
|
+
headers: response_headers
|
310
|
+
)
|
311
|
+
end
|
312
|
+
|
313
|
+
it 'wraps the response and calls the right endpoint' do
|
314
|
+
expect(post_response).to be_a(GoCardlessPro::Resources::PayerAuthorisation)
|
315
|
+
|
316
|
+
expect(stub).to have_been_requested
|
317
|
+
end
|
318
|
+
|
319
|
+
context 'when the request needs a body and custom header' do
|
320
|
+
let(:body) { { foo: 'bar' } }
|
321
|
+
let(:headers) { { 'Foo' => 'Bar' } }
|
322
|
+
subject(:post_response) { client.payer_authorisations.submit(resource_id, body, headers) }
|
323
|
+
|
324
|
+
let(:resource_id) { 'ABC123' }
|
325
|
+
|
326
|
+
let!(:stub) do
|
327
|
+
# /payer_authorisations/%v/actions/submit
|
328
|
+
stub_url = '/payer_authorisations/:identity/actions/submit'.gsub(':identity', resource_id)
|
329
|
+
stub_request(:post, /.*api.gocardless.com#{stub_url}/).
|
330
|
+
with(
|
331
|
+
body: { foo: 'bar' },
|
332
|
+
headers: { 'Foo' => 'Bar' }
|
333
|
+
).to_return(
|
334
|
+
body: {
|
335
|
+
'payer_authorisations' => {
|
336
|
+
|
337
|
+
'bank_account' => 'bank_account-input',
|
338
|
+
'created_at' => 'created_at-input',
|
339
|
+
'customer' => 'customer-input',
|
340
|
+
'id' => 'id-input',
|
341
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
342
|
+
'links' => 'links-input',
|
343
|
+
'mandate' => 'mandate-input',
|
344
|
+
'status' => 'status-input',
|
345
|
+
},
|
346
|
+
}.to_json,
|
347
|
+
headers: response_headers
|
348
|
+
)
|
349
|
+
end
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
describe '#confirm' do
|
354
|
+
subject(:post_response) { client.payer_authorisations.confirm(resource_id) }
|
355
|
+
|
356
|
+
let(:resource_id) { 'ABC123' }
|
357
|
+
|
358
|
+
let!(:stub) do
|
359
|
+
# /payer_authorisations/%v/actions/confirm
|
360
|
+
stub_url = '/payer_authorisations/:identity/actions/confirm'.gsub(':identity', resource_id)
|
361
|
+
stub_request(:post, /.*api.gocardless.com#{stub_url}/).to_return(
|
362
|
+
body: {
|
363
|
+
'payer_authorisations' => {
|
364
|
+
|
365
|
+
'bank_account' => 'bank_account-input',
|
366
|
+
'created_at' => 'created_at-input',
|
367
|
+
'customer' => 'customer-input',
|
368
|
+
'id' => 'id-input',
|
369
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
370
|
+
'links' => 'links-input',
|
371
|
+
'mandate' => 'mandate-input',
|
372
|
+
'status' => 'status-input',
|
373
|
+
},
|
374
|
+
}.to_json,
|
375
|
+
headers: response_headers
|
376
|
+
)
|
377
|
+
end
|
378
|
+
|
379
|
+
it 'wraps the response and calls the right endpoint' do
|
380
|
+
expect(post_response).to be_a(GoCardlessPro::Resources::PayerAuthorisation)
|
381
|
+
|
382
|
+
expect(stub).to have_been_requested
|
383
|
+
end
|
384
|
+
|
385
|
+
context 'when the request needs a body and custom header' do
|
386
|
+
let(:body) { { foo: 'bar' } }
|
387
|
+
let(:headers) { { 'Foo' => 'Bar' } }
|
388
|
+
subject(:post_response) { client.payer_authorisations.confirm(resource_id, body, headers) }
|
389
|
+
|
390
|
+
let(:resource_id) { 'ABC123' }
|
391
|
+
|
392
|
+
let!(:stub) do
|
393
|
+
# /payer_authorisations/%v/actions/confirm
|
394
|
+
stub_url = '/payer_authorisations/:identity/actions/confirm'.gsub(':identity', resource_id)
|
395
|
+
stub_request(:post, /.*api.gocardless.com#{stub_url}/).
|
396
|
+
with(
|
397
|
+
body: { foo: 'bar' },
|
398
|
+
headers: { 'Foo' => 'Bar' }
|
399
|
+
).to_return(
|
400
|
+
body: {
|
401
|
+
'payer_authorisations' => {
|
402
|
+
|
403
|
+
'bank_account' => 'bank_account-input',
|
404
|
+
'created_at' => 'created_at-input',
|
405
|
+
'customer' => 'customer-input',
|
406
|
+
'id' => 'id-input',
|
407
|
+
'incomplete_fields' => 'incomplete_fields-input',
|
408
|
+
'links' => 'links-input',
|
409
|
+
'mandate' => 'mandate-input',
|
410
|
+
'status' => 'status-input',
|
411
|
+
},
|
412
|
+
}.to_json,
|
413
|
+
headers: response_headers
|
414
|
+
)
|
415
|
+
end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
end
|