braintree 4.33.0 → 4.33.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e524f55d0d9990e6d2c25d6dbd81b3d75833ef145a624c70af52119d2b71fd8
4
- data.tar.gz: c060e46e74b749cd934e7eecef42f4d783e6e8252ed59aff41acf574379141a3
3
+ metadata.gz: 4e90519d70f62c557f0f25c54d7c481854711c5206ae20a24d09ca3c7ea77970
4
+ data.tar.gz: f07cc386365888000e3e44f6083b24f1d8fec0e25bba465f0e157a97c9d54e51
5
5
  SHA512:
6
- metadata.gz: 2796040657fc77358e616b12dea6b8e1e9ebb1b06bd0d0d284b7ee2cb14f2e12d34e5570ed9d512b07293ef5605751ba2116a637077b0b19f0a2d6fd11704ada
7
- data.tar.gz: 31ce1b5335dd36150b8f2dc46df425e17ea4e10bf2e8d0a6b44d2d0f72732c72e3d3b6f9f0a9362de56ded2ca70037a707210f72cff45955947407a8bc61273a
6
+ metadata.gz: c801cf89c35d0f835fa9f8513e3cffb39e19cd5e3aee3e004db2047a129bf3519ee2f00396ae47ef4ce01bf95f2abc56719ead396733cf5977eb4d9ad8323d80
7
+ data.tar.gz: 57112741f710b8e08c8d03ebba98e1e385be46a6dcac917c52f717f6e1007a3bfeda9a329c7973ed32d3f4e9a1da5669a1ca7b518491cf643d643c88cc81f7ed
@@ -2,7 +2,7 @@ module Braintree
2
2
  module Version
3
3
  Major = 4
4
4
  Minor = 33
5
- Tiny = 0
5
+ Tiny = 1
6
6
 
7
7
  String = "#{Major}.#{Minor}.#{Tiny}"
8
8
  end
@@ -12,12 +12,14 @@ module Braintree
12
12
  end
13
13
 
14
14
  def self._node_to_hash(node, hash = {})
15
+ sub_hash = node.text? ? hash : _build_sub_hash(hash, node.name)
16
+
15
17
  if node.text? || (node.children.size == 1 && node.children.first.text?)
16
18
  content = node.text? ? node.content : node.children.first.content
17
19
  raise "Content too large" if content.length >= NOKOGIRI_XML_LIMIT
18
- hash[CONTENT_ROOT] = content
20
+ sub_hash[CONTENT_ROOT] = content
21
+ _attributes_to_hash(node, sub_hash) unless node.text?
19
22
  else
20
- sub_hash = _build_sub_hash(hash, node.name)
21
23
  _attributes_to_hash(node, sub_hash)
22
24
  if _array?(node)
23
25
  _children_array_to_hash(node, sub_hash)
@@ -66,4 +68,4 @@ module Braintree
66
68
  end
67
69
  end
68
70
  end
69
- end
71
+ end
@@ -33,5 +33,16 @@ module Braintree
33
33
  end
34
34
  end
35
35
  end
36
+
37
+ describe "error response handling" do
38
+ it "correctly parses error response with nested structure" do
39
+ error_xml = "<api-error-response><message>Invalid request</message><errors><errors type=\"array\"></errors></errors></api-error-response>"
40
+ result = Braintree::Xml::Parser.hash_from_xml(error_xml)
41
+
42
+ expect(result[:api_error_response]).to be_a(Hash)
43
+ expect(result[:api_error_response][:message]).to eq("Invalid request")
44
+ expect(result[:api_error_response][:errors]).to be_a(Hash)
45
+ end
46
+ end
36
47
  end
37
48
  end
@@ -14,6 +14,34 @@ describe Braintree::ErrorResult do
14
14
  )
15
15
  end.to_not raise_error
16
16
  end
17
+
18
+ it "handles parsed XML error response structure correctly" do
19
+ data = {
20
+ :message => "Validation failed",
21
+ :errors => {
22
+ :errors => [{:code => "81234", :message => "Field is required"}]
23
+ }
24
+ }
25
+
26
+ expect do
27
+ result = Braintree::ErrorResult.new(:gateway, data)
28
+ expect(result.message).to eq("Validation failed")
29
+ expect(result.errors.inspect).to eq("#<Braintree::Errors :[(81234) Field is required]>")
30
+ end.to_not raise_error
31
+ end
32
+
33
+ it "handles empty error array in parsed XML response" do
34
+ data = {
35
+ :message => "Invalid request",
36
+ :errors => {:errors => []}
37
+ }
38
+
39
+ expect do
40
+ result = Braintree::ErrorResult.new(:gateway, data)
41
+ expect(result.message).to eq("Invalid request")
42
+ expect(result.errors).to be_a(Braintree::Errors)
43
+ end.to_not raise_error
44
+ end
17
45
  end
18
46
 
19
47
  describe "inspect" do
@@ -81,5 +81,62 @@ describe Braintree::Xml::Parser do
81
81
  END
82
82
  expect(xml).to parse_to(:root => {:paypal_details => {:deets => [{:secret_code => "1234"}], :payer_email => "abc@test.com", :payment_id => "1234567890"}})
83
83
  end
84
+
85
+ it "does not collapse nested structures with single-child elements" do
86
+ xml = "<api-error-response><message>Test</message><errors><errors type=\"array\"></errors></errors></api-error-response>"
87
+ expect(xml).to parse_to({:api_error_response=>{:message=>"Test", :errors=>{:errors=>[]}}})
88
+ end
89
+
90
+ it "preserves hash structure when one key has array value" do
91
+ xml = <<-END
92
+ <root>
93
+ <message>Error message</message>
94
+ <items type="array">
95
+ <item>Value1</item>
96
+ </items>
97
+ </root>
98
+ END
99
+ expect(xml).to parse_to({:root => {:message => "Error message", :items => ["Value1"]}})
100
+ end
101
+
102
+ it "handles error response with nested errors correctly" do
103
+ xml = <<-END
104
+ <api-error-response>
105
+ <message>Validation failed</message>
106
+ <errors>
107
+ <errors type="array">
108
+ <error>
109
+ <code>81234</code>
110
+ <message>Field is required</message>
111
+ </error>
112
+ </errors>
113
+ </errors>
114
+ </api-error-response>
115
+ END
116
+ expect(xml).to parse_to({
117
+ :api_error_response => {
118
+ :message => "Validation failed",
119
+ :errors => {
120
+ :errors => [{:code => "81234", :message => "Field is required"}]
121
+ }
122
+ }
123
+ })
124
+ end
125
+
126
+ it "handles client token error response structure" do
127
+ xml = <<-END
128
+ <api-error-response>
129
+ <message>Invalid request</message>
130
+ <errors>
131
+ <errors type="array"></errors>
132
+ </errors>
133
+ </api-error-response>
134
+ END
135
+ result = Braintree::Xml::Parser.hash_from_xml(xml)
136
+ expect(result[:api_error_response]).to be_a(Hash)
137
+ expect(result[:api_error_response][:message]).to eq("Invalid request")
138
+ expect(result[:api_error_response][:errors]).to be_a(Hash)
139
+ expect(result[:api_error_response][:errors][:errors]).to eq([])
140
+ end
84
141
  end
85
142
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: braintree
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.33.0
4
+ version: 4.33.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Braintree
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-10-24 00:00:00.000000000 Z
11
+ date: 2025-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: builder
@@ -405,7 +405,7 @@ metadata:
405
405
  changelog_uri: https://github.com/braintree/braintree_ruby/blob/master/CHANGELOG.md
406
406
  source_code_uri: https://github.com/braintree/braintree_ruby
407
407
  documentation_uri: https://developer.paypal.com/braintree/docs
408
- post_install_message:
408
+ post_install_message:
409
409
  rdoc_options: []
410
410
  require_paths:
411
411
  - lib
@@ -420,8 +420,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
420
420
  - !ruby/object:Gem::Version
421
421
  version: '0'
422
422
  requirements: []
423
- rubygems_version: 3.2.5
424
- signing_key:
423
+ rubygems_version: 3.3.15
424
+ signing_key:
425
425
  specification_version: 4
426
426
  summary: Braintree Ruby Server SDK
427
427
  test_files: []