Skip to content

Commit f372df4

Browse files
committed
Improve handling of non-Hash response values.
1 parent 40845a1 commit f372df4

File tree

3 files changed

+128
-16
lines changed

3 files changed

+128
-16
lines changed

lib/cloudflare/representation.rb

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,9 @@
1010
require "async/rest/representation"
1111
require "async/rest/wrapper/json"
1212

13+
require_relative "request_error"
14+
1315
module Cloudflare
14-
class RequestError < StandardError
15-
def initialize(request, value)
16-
if error = value[:error]
17-
super("#{request}: #{error}")
18-
elsif errors = value[:errors]
19-
super("#{request}: #{errors.map{|attributes| attributes[:message]}.join(', ')}")
20-
else
21-
super("#{request}: #{value.inspect}")
22-
end
23-
24-
@value = value
25-
end
26-
27-
attr :value
28-
end
29-
3016
class Wrapper < Async::REST::Wrapper::JSON
3117
def process_response(request, response)
3218
super

lib/cloudflare/request_error.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# frozen_string_literal: true
2+
3+
# Released under the MIT License.
4+
# Copyright, 2017-2024, by Samuel Williams.
5+
6+
module Cloudflare
7+
class RequestError < StandardError
8+
def self.error_string_for(value)
9+
if value.is_a?(Hash)
10+
if error = value[:error]
11+
return error
12+
elsif errors = value[:errors]
13+
return errors.map{|attributes| attributes[:message]}.join(", ")
14+
end
15+
end
16+
17+
return value.inspect
18+
end
19+
20+
def initialize(request, value)
21+
super("#{request}: #{self.class.error_string_for(value)}")
22+
23+
@value = value
24+
end
25+
26+
attr :value
27+
end
28+
end

test/cloudflare/request_error.rb

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# frozen_string_literal: true
2+
3+
# Released under the MIT License.
4+
# Copyright, 2024, by Samuel Williams.
5+
6+
require "cloudflare/request_error"
7+
8+
describe Cloudflare::RequestError do
9+
with ".error_string_for with hash containing :error key" do
10+
it "returns the error value" do
11+
value = {error: "Something went wrong"}
12+
result = Cloudflare::RequestError.error_string_for(value)
13+
14+
expect(result).to be == "Something went wrong"
15+
end
16+
end
17+
18+
with ".error_string_for with hash containing :errors key" do
19+
it "returns comma-separated error messages" do
20+
value = {
21+
errors: [
22+
{message: "First error"},
23+
{message: "Second error"},
24+
{message: "Third error"}
25+
]
26+
}
27+
result = Cloudflare::RequestError.error_string_for(value)
28+
29+
expect(result).to be == "First error, Second error, Third error"
30+
end
31+
32+
it "handles empty errors array" do
33+
value = {errors: []}
34+
result = Cloudflare::RequestError.error_string_for(value)
35+
36+
expect(result).to be == ""
37+
end
38+
end
39+
40+
with ".error_string_for with plain string" do
41+
it "returns inspected value" do
42+
value = "Plain error message"
43+
result = Cloudflare::RequestError.error_string_for(value)
44+
45+
expect(result).to be == "\"Plain error message\""
46+
end
47+
end
48+
49+
with ".error_string_for with other types" do
50+
it "returns inspected value for integer" do
51+
value = 42
52+
result = Cloudflare::RequestError.error_string_for(value)
53+
54+
expect(result).to be == "42"
55+
end
56+
57+
it "returns inspected value for nil" do
58+
value = nil
59+
result = Cloudflare::RequestError.error_string_for(value)
60+
61+
expect(result).to be == "nil"
62+
end
63+
end
64+
65+
with "#initialize" do
66+
it "creates error with hash containing :error key" do
67+
request = "GET /api/v1/test"
68+
value = {error: "Authentication failed"}
69+
error = Cloudflare::RequestError.new(request, value)
70+
71+
expect(error.message).to be == "GET /api/v1/test: Authentication failed"
72+
expect(error.value).to be == value
73+
end
74+
75+
it "creates error with hash containing :errors key" do
76+
request = "POST /api/v1/test"
77+
value = {
78+
errors: [
79+
{message: "Field 'name' is required"},
80+
{message: "Field 'email' is invalid"}
81+
]
82+
}
83+
error = Cloudflare::RequestError.new(request, value)
84+
85+
expect(error.message).to be == "POST /api/v1/test: Field 'name' is required, Field 'email' is invalid"
86+
expect(error.value).to be == value
87+
end
88+
89+
it "creates error with plain string" do
90+
request = "DELETE /api/v1/test"
91+
value = "Resource not found"
92+
error = Cloudflare::RequestError.new(request, value)
93+
94+
expect(error.message).to be == "DELETE /api/v1/test: \"Resource not found\""
95+
expect(error.value).to be == value
96+
end
97+
end
98+
end

0 commit comments

Comments
 (0)