pcp-server-ruby-sdk 1.8.0 → 1.10.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.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/README.md +1 -1
  4. data/api-definition.yaml +5200 -5012
  5. data/lib/PCP-server-Ruby-SDK/endpoints/checkout_api_client.rb +3 -1
  6. data/lib/PCP-server-Ruby-SDK/endpoints/commerce_case_api_client.rb +5 -4
  7. data/lib/PCP-server-Ruby-SDK/endpoints/order_management_checkout_actions_api_client.rb +25 -0
  8. data/lib/PCP-server-Ruby-SDK/endpoints/payment_execution_api_client.rb +26 -0
  9. data/lib/PCP-server-Ruby-SDK/models/cancel_payment_request.rb +16 -4
  10. data/lib/PCP-server-Ruby-SDK/models/cart_item_supplier_references.rb +2 -0
  11. data/lib/PCP-server-Ruby-SDK/models/commerce_cases_response.rb +18 -0
  12. data/lib/PCP-server-Ruby-SDK/models/fund_split_request.rb +153 -0
  13. data/lib/PCP-server-Ruby-SDK/models/fund_split_response.rb +180 -0
  14. data/lib/PCP-server-Ruby-SDK/models/payment_references_for_refund.rb +9 -2
  15. data/lib/PCP-server-Ruby-SDK/models/redirect_payment_method_specific_input.rb +10 -1
  16. data/lib/PCP-server-Ruby-SDK/models/redirect_payment_product900_specific_input.rb +183 -0
  17. data/lib/PCP-server-Ruby-SDK/models/required_field_validation.rb +108 -0
  18. data/lib/PCP-server-Ruby-SDK/version.rb +1 -1
  19. data/lib/PCP-server-Ruby-SDK.rb +7 -0
  20. data/package-lock.json +2 -2
  21. data/package.json +1 -1
  22. data/spec/endpoints/checkout_api_client_spec.rb +22 -0
  23. data/spec/endpoints/order_management_checkout_actions_api_client_spec.rb +51 -0
  24. data/spec/endpoints/payment_execution_api_client_spec.rb +52 -0
  25. data/spec/models/required_field_validation_spec.rb +551 -0
  26. metadata +14 -7
@@ -0,0 +1,183 @@
1
+
2
+ require 'date'
3
+ require 'time'
4
+
5
+ module PCPServerSDK
6
+ module Models
7
+ class RedirectPaymentProduct900SpecificInput
8
+ attr_accessor :capture_trigger
9
+
10
+ class EnumAttributeValidator
11
+ attr_reader :datatype
12
+ attr_reader :allowable_values
13
+
14
+ def initialize(datatype, allowable_values)
15
+ @allowable_values = allowable_values.map do |value|
16
+ case datatype.to_s
17
+ when /Integer/i
18
+ value.to_i
19
+ when /Float/i
20
+ value.to_f
21
+ else
22
+ value
23
+ end
24
+ end
25
+ end
26
+
27
+ def valid?(value)
28
+ !value || allowable_values.include?(value)
29
+ end
30
+ end
31
+
32
+ def self.attribute_map
33
+ {
34
+ :'capture_trigger' => :'captureTrigger'
35
+ }
36
+ end
37
+
38
+ def self.acceptable_attributes
39
+ attribute_map.values
40
+ end
41
+
42
+ def self.openapi_types
43
+ {
44
+ :'capture_trigger' => :'String'
45
+ }
46
+ end
47
+
48
+ def self.openapi_nullable
49
+ Set.new([])
50
+ end
51
+
52
+ def initialize(attributes = {})
53
+ if (!attributes.is_a?(Hash))
54
+ fail ArgumentError, "The input argument (attributes) must be a hash in `RedirectPaymentProduct900SpecificInput` initialize method"
55
+ end
56
+
57
+ attributes = attributes.each_with_object({}) { |(k, v), h|
58
+ if (!self.class.attribute_map.key?(k.to_sym))
59
+ fail ArgumentError, "`#{k}` is not a valid attribute in `RedirectPaymentProduct900SpecificInput`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
60
+ end
61
+ h[k.to_sym] = v
62
+ }
63
+
64
+ if attributes.key?(:'capture_trigger')
65
+ self.capture_trigger = attributes[:'capture_trigger']
66
+ end
67
+ end
68
+
69
+ def ==(o)
70
+ return true if self.equal?(o)
71
+ self.class == o.class &&
72
+ capture_trigger == o.capture_trigger
73
+ end
74
+
75
+ def eql?(o)
76
+ self == o
77
+ end
78
+
79
+ def hash
80
+ [capture_trigger].hash
81
+ end
82
+
83
+ def self.build_from_hash(attributes)
84
+ return nil unless attributes.is_a?(Hash)
85
+ attributes = attributes.transform_keys(&:to_sym)
86
+ transformed_hash = {}
87
+ openapi_types.each_pair do |key, type|
88
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
89
+ transformed_hash["#{key}"] = nil
90
+ elsif type =~ /\AArray<(.*)>/i
91
+ if attributes[attribute_map[key]].is_a?(Array)
92
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
93
+ end
94
+ elsif !attributes[attribute_map[key]].nil?
95
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
96
+ end
97
+ end
98
+ new(transformed_hash)
99
+ end
100
+
101
+ def self._deserialize(type, value)
102
+ case type.to_sym
103
+ when :Time
104
+ Time.parse(value)
105
+ when :Date
106
+ Date.parse(value)
107
+ when :String
108
+ value.to_s
109
+ when :Integer
110
+ value.to_i
111
+ when :Float
112
+ value.to_f
113
+ when :Boolean
114
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
115
+ true
116
+ else
117
+ false
118
+ end
119
+ when :Object
120
+ value
121
+ when /\AArray<(?<inner_type>.+)>\z/
122
+ inner_type = Regexp.last_match[:inner_type]
123
+ value.map { |v| _deserialize(inner_type, v) }
124
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
125
+ k_type = Regexp.last_match[:k_type]
126
+ v_type = Regexp.last_match[:v_type]
127
+ {}.tap do |hash|
128
+ value.each do |k, v|
129
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
130
+ end
131
+ end
132
+ else
133
+ klass = PCPServerSDK::Models.const_get(type)
134
+ klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
135
+ end
136
+ end
137
+
138
+ def to_s
139
+ to_hash.to_s
140
+ end
141
+
142
+ def to_body
143
+ to_hash
144
+ end
145
+
146
+ def to_hash
147
+ hash = {}
148
+ self.class.attribute_map.each_pair do |attr, param|
149
+ value = self.send(attr)
150
+ if value.nil?
151
+ is_nullable = self.class.openapi_nullable.include?(attr)
152
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
153
+ end
154
+
155
+ hash[param] = _to_hash(value)
156
+ end
157
+ hash
158
+ end
159
+
160
+ def _to_hash(value)
161
+ if value.is_a?(Array)
162
+ value.compact.map { |v| _to_hash(v) }
163
+ elsif value.is_a?(Hash)
164
+ {}.tap do |hash|
165
+ value.each { |k, v| hash[k] = _to_hash(v) }
166
+ end
167
+ elsif value.respond_to? :to_hash
168
+ value.to_hash
169
+ else
170
+ value
171
+ end
172
+ end
173
+
174
+ def capture_trigger=(capture_trigger)
175
+ validator = EnumAttributeValidator.new('String', ['shipping', 'delivery', 'availability', 'serviceFulfillment', 'other'])
176
+ unless validator.valid?(capture_trigger)
177
+ fail ArgumentError, "invalid value for \"capture_trigger\", must be one of #{validator.allowable_values}."
178
+ end
179
+ @capture_trigger = capture_trigger
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,108 @@
1
+ require 'date'
2
+ require 'psych'
3
+ require 'set'
4
+
5
+ module PCPServerSDK
6
+ module Models
7
+ module RequiredFieldValidation
8
+ SCHEMA_PATH = File.expand_path('../../../api-definition.yaml', __dir__)
9
+
10
+ class << self
11
+ def install!
12
+ required_attributes_by_class.each do |class_name, required_attributes|
13
+ next unless PCPServerSDK::Models.const_defined?(class_name, false)
14
+
15
+ klass = PCPServerSDK::Models.const_get(class_name)
16
+ next unless klass.is_a?(Class)
17
+ next if klass < Array
18
+ next unless klass.respond_to?(:attribute_map)
19
+ next if klass.instance_variable_defined?(:@required_field_validation_installed)
20
+
21
+ klass.prepend(build_validation_module(required_attributes))
22
+ klass.singleton_class.prepend(build_class_validation_module)
23
+ klass.instance_variable_set(:@required_field_validation_installed, true)
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def build_validation_module(required_attributes)
30
+ Module.new do
31
+ define_method(:initialize) do |attributes = {}|
32
+ @required_field_validation_initializing = true
33
+ initialization_succeeded = false
34
+
35
+ begin
36
+ super(attributes)
37
+ initialization_succeeded = true
38
+ ensure
39
+ @required_field_validation_initializing = false
40
+ end
41
+
42
+ if initialization_succeeded && attributes.is_a?(Hash) && !attributes.empty?
43
+ validate_required_fields!
44
+ end
45
+ end
46
+
47
+ define_method(:validate_required_fields!) do
48
+ missing_attributes = required_attributes.select { |attribute| public_send(attribute).nil? }
49
+ return if missing_attributes.empty?
50
+
51
+ raise ArgumentError, "#{missing_attributes.first} cannot be nil"
52
+ end
53
+
54
+ define_method(:to_hash) do
55
+ validate_required_fields!
56
+ super()
57
+ end
58
+
59
+ required_attributes.each do |attribute|
60
+ define_method("#{attribute}=") do |value|
61
+ if value.nil? && !@required_field_validation_initializing
62
+ raise ArgumentError, "#{attribute} cannot be nil"
63
+ end
64
+
65
+ super(value)
66
+ end
67
+ end
68
+ end
69
+ end
70
+ def build_class_validation_module
71
+ Module.new do
72
+ def build_from_hash(attributes)
73
+ object = super(attributes)
74
+ return object if object.nil?
75
+ return object if object.is_a?(Array)
76
+
77
+ object.send(:validate_required_fields!) if object.respond_to?(:validate_required_fields!, true)
78
+ object
79
+ end
80
+ end
81
+ end
82
+
83
+ def required_attributes_by_class
84
+ @required_attributes_by_class ||= begin
85
+ spec = Psych.safe_load_file(SCHEMA_PATH, permitted_classes: [Time, Date, Symbol], aliases: true)
86
+ schemas = spec.dig('components', 'schemas') || {}
87
+
88
+ schemas.each_with_object({}) do |(schema_name, schema), mapping|
89
+ required_properties = Array(schema['required'])
90
+ next if required_properties.empty?
91
+ next unless PCPServerSDK::Models.const_defined?(schema_name, false)
92
+
93
+ klass = PCPServerSDK::Models.const_get(schema_name)
94
+ next unless klass.is_a?(Class)
95
+ next unless klass.respond_to?(:attribute_map)
96
+
97
+ attribute_map = klass.attribute_map.invert
98
+ required_attributes = required_properties.filter_map { |property| attribute_map[property.to_sym] }
99
+ next if required_attributes.empty?
100
+
101
+ mapping[schema_name] = required_attributes.freeze
102
+ end.freeze
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module PCPServerSDK
3
- VERSION = '1.8.0'
3
+ VERSION = '1.10.0'
4
4
  end
@@ -52,6 +52,7 @@ require_relative 'PCP-server-Ruby-SDK/models/checkout_references'
52
52
  require_relative 'PCP-server-Ruby-SDK/models/checkout_response'
53
53
  require_relative 'PCP-server-Ruby-SDK/models/checkouts_response'
54
54
  require_relative 'PCP-server-Ruby-SDK/models/commerce_case_response'
55
+ require_relative 'PCP-server-Ruby-SDK/models/commerce_cases_response'
55
56
  require_relative 'PCP-server-Ruby-SDK/models/company_information'
56
57
  require_relative 'PCP-server-Ruby-SDK/models/complete_financing_payment_method_specific_input'
57
58
  require_relative 'PCP-server-Ruby-SDK/models/complete_order_request'
@@ -77,6 +78,8 @@ require_relative 'PCP-server-Ruby-SDK/models/financing_payment_method_specific_i
77
78
  require_relative 'PCP-server-Ruby-SDK/models/financing_payment_method_specific_output'
78
79
  require_relative 'PCP-server-Ruby-SDK/models/fund_distribution'
79
80
  require_relative 'PCP-server-Ruby-SDK/models/fund_split'
81
+ require_relative 'PCP-server-Ruby-SDK/models/fund_split_request'
82
+ require_relative 'PCP-server-Ruby-SDK/models/fund_split_response'
80
83
  require_relative 'PCP-server-Ruby-SDK/models/installment_option'
81
84
  require_relative 'PCP-server-Ruby-SDK/models/link_information'
82
85
  require_relative 'PCP-server-Ruby-SDK/models/mandate_recurrence_type'
@@ -137,6 +140,7 @@ require_relative 'PCP-server-Ruby-SDK/models/complete_payment_product840_specifi
137
140
  require_relative 'PCP-server-Ruby-SDK/models/complete_redirect_payment_method_specific_input'
138
141
  require_relative 'PCP-server-Ruby-SDK/models/redirect_payment_method_specific_output'
139
142
  require_relative 'PCP-server-Ruby-SDK/models/redirect_payment_product840_specific_input'
143
+ require_relative 'PCP-server-Ruby-SDK/models/redirect_payment_product900_specific_input'
140
144
  require_relative 'PCP-server-Ruby-SDK/models/redirection_data'
141
145
  require_relative 'PCP-server-Ruby-SDK/models/references'
142
146
  require_relative 'PCP-server-Ruby-SDK/models/refresh_payment_request'
@@ -175,6 +179,7 @@ require_relative 'PCP-server-Ruby-SDK/models/applepay/apple_pay_payment_data_hea
175
179
  require_relative 'PCP-server-Ruby-SDK/models/applepay/apple_pay_payment_method'
176
180
  require_relative 'PCP-server-Ruby-SDK/models/applepay/apple_pay_payment_method_type'
177
181
  require_relative 'PCP-server-Ruby-SDK/models/applepay/apple_pay_payment_token'
182
+ require_relative 'PCP-server-Ruby-SDK/models/required_field_validation'
178
183
 
179
184
  # Queries
180
185
  require_relative 'PCP-server-Ruby-SDK/queries/get_checkouts_query'
@@ -191,6 +196,8 @@ require_relative 'PCP-server-Ruby-SDK/request_header_generator'
191
196
  require_relative 'PCP-server-Ruby-SDK/version'
192
197
 
193
198
  module PCPServerSDK
199
+ PCPServerSDK::Models::RequiredFieldValidation.install!
200
+
194
201
  class << self
195
202
  # Customize default settings for the SDK using block.
196
203
  # PCPServerSDK.configure do |config|
data/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pcp-serversdk-ruby",
3
- "version": "1.8.0",
3
+ "version": "1.10.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pcp-serversdk-ruby",
9
- "version": "1.8.0",
9
+ "version": "1.10.0",
10
10
  "devDependencies": {
11
11
  "@commitlint/cli": "19.4.0",
12
12
  "@commitlint/config-conventional": "19.2.2",
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pcp-serversdk-ruby",
3
- "version": "1.8.0",
3
+ "version": "1.10.0",
4
4
  "type": "commonjs",
5
5
  "scripts": {
6
6
  "changelog": "conventional-changelog -i CHANGELOG.md -s --config ./changelog.config.js"
@@ -255,6 +255,28 @@ RSpec.describe PCPServerSDK::Endpoints::CheckoutApiClient do
255
255
  end
256
256
  end
257
257
 
258
+ describe '#remove_checkout_request' do
259
+ context 'when request is successful' do
260
+ let(:response) { double('Response', body: '{}', code: 200) }
261
+
262
+ before do
263
+ allow(client).to receive(:get_response).and_return(response)
264
+ end
265
+
266
+ it 'does not raise an error' do
267
+ expect { client.remove_checkout_request('1', '2', '3') }.not_to raise_error
268
+ end
269
+ end
270
+
271
+ context 'when some params are nil' do
272
+ it 'raises a TypeError' do
273
+ expect { client.remove_checkout_request(nil, '2', '3') }.to raise_error(TypeError, 'Merchant ID is required')
274
+ expect { client.remove_checkout_request('1', nil, '3') }.to raise_error(TypeError, 'Commerce Case ID is required')
275
+ expect { client.remove_checkout_request('1', '2', nil) }.to raise_error(TypeError, 'Checkout ID is required')
276
+ end
277
+ end
278
+ end
279
+
258
280
  describe '#complete_checkout_request' do
259
281
  let(:payload) { double('PCPServerSDK::Models::CompleteOrderRequest') }
260
282
 
@@ -113,6 +113,57 @@ RSpec.describe PCPServerSDK::Endpoints::OrderManagementCheckoutActionsApiClient
113
113
  end
114
114
  end
115
115
 
116
+ describe '#complete_order' do
117
+ let(:payload) { double('PCPServerSDK::Models::CompleteOrderRequest') }
118
+
119
+ context 'when request is successful' do
120
+ let(:response) { double('Response', body: '{}', code: '200') }
121
+ let(:expected_response) { PCPServerSDK::Models::CompletePaymentResponse.new }
122
+
123
+ before do
124
+ allow(client).to receive(:get_response).and_return(response)
125
+ end
126
+
127
+ it 'returns a successful response' do
128
+ result = client.complete_order('1', '2', '3', payload)
129
+ expect(result).to eq(expected_response)
130
+ end
131
+ end
132
+
133
+ context 'when request is unsuccessful (400)' do
134
+ let(:response) { double('Response', body: error_body, code: '400') }
135
+
136
+ before do
137
+ allow(client).to receive(:get_response).and_return(response)
138
+ end
139
+
140
+ it 'raises an PCPServerSDK::Errors::ApiErrorResponseException' do
141
+ expect { client.complete_order('1', '2', '3', payload) }.to raise_error(PCPServerSDK::Errors::ApiErrorResponseException)
142
+ end
143
+ end
144
+
145
+ context 'when request is unsuccessful (500)' do
146
+ let(:response) { double('Response', body: '{}', code: '500') }
147
+
148
+ before do
149
+ allow(client).to receive(:get_response).and_return(response)
150
+ end
151
+
152
+ it 'raises an PCPServerSDK::Errors::ApiResponseRetrievalException' do
153
+ expect { client.complete_order('1', '2', '3', payload) }.to raise_error(PCPServerSDK::Errors::ApiResponseRetrievalException)
154
+ end
155
+ end
156
+
157
+ context 'when some params are nil' do
158
+ it 'raises a TypeError' do
159
+ expect { client.complete_order(nil, '2', '3', payload) }.to raise_error(TypeError, 'Merchant ID is required')
160
+ expect { client.complete_order('1', nil, '3', payload) }.to raise_error(TypeError, 'Commerce Case ID is required')
161
+ expect { client.complete_order('1', '2', nil, payload) }.to raise_error(TypeError, 'Checkout ID is required')
162
+ expect { client.complete_order('1', '2', '3', nil) }.to raise_error(TypeError, 'Payload is required')
163
+ end
164
+ end
165
+ end
166
+
116
167
  describe '#return_order' do
117
168
  let(:payload) { double('PCPServerSDK::Models::ReturnRequest') }
118
169
 
@@ -377,4 +377,56 @@ RSpec.describe PCPServerSDK::Endpoints::PaymentExecutionApiClient do
377
377
  end
378
378
  end
379
379
  end
380
+
381
+ describe '#create_fund_split' do
382
+ let(:payload) { double('PCPServerSDK::Models::FundSplitRequest') }
383
+
384
+ context 'when request is successful' do
385
+ let(:response) { double('Response', body: '{}', code: '200') }
386
+ let(:expected_response) { PCPServerSDK::Models::FundSplitResponse.new }
387
+
388
+ before do
389
+ allow(client).to receive(:get_response).and_return(response)
390
+ end
391
+
392
+ it 'returns a successful response' do
393
+ result = client.create_fund_split('1', '2', '3', '4', '5', payload)
394
+ expect(result).to eq(expected_response)
395
+ end
396
+ end
397
+
398
+ context 'when request is unsuccessful (400)' do
399
+ let(:response) { double('Response', body: error_body, code: '400') }
400
+
401
+ before do
402
+ allow(client).to receive(:get_response).and_return(response)
403
+ end
404
+
405
+ it 'raises an PCPServerSDK::Errors::ApiErrorResponseException' do
406
+ expect { client.create_fund_split('1', '2', '3', '4', '5', payload) }.to raise_error(PCPServerSDK::Errors::ApiErrorResponseException)
407
+ end
408
+ end
409
+
410
+ context 'when request is unsuccessful (500)' do
411
+ let(:response) { double('Response', body: '{}', code: '500') }
412
+
413
+ before do
414
+ allow(client).to receive(:get_response).and_return(response)
415
+ end
416
+
417
+ it 'raises an PCPServerSDK::Errors::ApiResponseRetrievalException' do
418
+ expect { client.create_fund_split('1', '2', '3', '4', '5', payload) }.to raise_error(PCPServerSDK::Errors::ApiResponseRetrievalException)
419
+ end
420
+ end
421
+
422
+ context 'when some params are nil' do
423
+ it 'raises a TypeError' do
424
+ expect { client.create_fund_split(nil, '2', '3', '4', '5', payload) }.to raise_error(TypeError, 'Merchant ID is required')
425
+ expect { client.create_fund_split('1', nil, '3', '4', '5', payload) }.to raise_error(TypeError, 'Commerce Case ID is required')
426
+ expect { client.create_fund_split('1', '2', nil, '4', '5', payload) }.to raise_error(TypeError, 'Checkout ID is required')
427
+ expect { client.create_fund_split('1', '2', '3', nil, '5', payload) }.to raise_error(TypeError, 'Payment Execution ID is required')
428
+ expect { client.create_fund_split('1', '2', '3', '4', nil, payload) }.to raise_error(TypeError, 'Event ID is required')
429
+ end
430
+ end
431
+ end
380
432
  end