flexirest 1.9.12 → 1.9.13
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/CHANGELOG.md +7 -0
- data/docs/httpparse-error-handling.md +16 -3
- data/lib/flexirest/attribute_parsing.rb +2 -1
- data/lib/flexirest/request.rb +49 -37
- data/lib/flexirest/version.rb +1 -1
- data/spec/lib/request_spec.rb +137 -16
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d22b9c2c356eec70454c6919ec81ac6fc37a42e500c95c2f40337ba3e40561a6
|
4
|
+
data.tar.gz: eaf44cd2c1e6378fc140beec5b38793880ff34b18ea49b57146e038dfe54cc01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33fc03579ec1bdd3a2af9542209efced52ab03294f06e36c9b19e0dc526b9f3982befba154a2621c318ecd9d70dda3b31b099b0bd3a13a11748b4678c33d86b1
|
7
|
+
data.tar.gz: aa5c88116eebc320d09b03932660a2299425647457758bcd080d842a2c895ed2584c2c068e1d9de0fcbe474fe76da41371b5631ce36022b8e76cd4a2e6aa6e87
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.9.13
|
4
|
+
|
5
|
+
Change:
|
6
|
+
|
7
|
+
- Unified the response body to be `body` for all exceptions instead of sometimes being `body` and sometimes being `raw_response`, although both are available as aliases where they were defined before (thanks to Romain Gisiger for the PR).
|
8
|
+
- Adjust parsing of attributes to be done in a more unified way and lighten the CPU load (thanks to Romain Gisiger for the PR)
|
9
|
+
|
3
10
|
## 1.9.12
|
4
11
|
|
5
12
|
Bugfix:
|
@@ -1,16 +1,29 @@
|
|
1
1
|
# *Flexirest:* HTTP/parse error handling
|
2
2
|
|
3
|
-
|
3
|
+
## HTTP Errors
|
4
|
+
|
5
|
+
Sometimes the backend server may respond with a non-2xx/3xx header, in which case the code will raise an `Flexirest::HTTPClientException` for 4xx errors or an `Flexirest::HTTPServerException` for 5xx errors.
|
6
|
+
|
7
|
+
These both have a `status` accessor, a `result` accessor (for getting access to the parsed body) and a `body` accessor (for getting access to the original unparsed body). However, you can make use of the `message` method (or the `to_s` method) that will build a nice error message for you (containing the URL and the HTTP method used for the request as well as the HTTP status code and the original body of the response).
|
4
8
|
|
5
9
|
```ruby
|
6
10
|
begin
|
7
11
|
Person.all
|
8
12
|
rescue Flexirest::HTTPClientException, Flexirest::HTTPServerException => e
|
9
|
-
|
13
|
+
# Display the HTTP status and parsed body
|
14
|
+
puts "Backend returned HTTP #{e.status} with following parsed body: #{e.result}"
|
15
|
+
|
16
|
+
# Display the unparsed body
|
17
|
+
puts "Original body is: #{e.body}"
|
18
|
+
|
19
|
+
# Using the message method, same than calling the to_s method
|
20
|
+
puts e.message
|
10
21
|
end
|
11
22
|
```
|
12
23
|
|
13
|
-
|
24
|
+
## Parse Error
|
25
|
+
|
26
|
+
If the original response is unparsable (e.g. not in the desired content type), then it will raise an `Flexirest::ResponseParseException` which has a `status` accessor for the HTTP status code and a `body` accessor for the unparsed response body.
|
14
27
|
|
15
28
|
-----
|
16
29
|
|
@@ -3,7 +3,8 @@ module Flexirest
|
|
3
3
|
private
|
4
4
|
|
5
5
|
def parse_attribute_value(v)
|
6
|
-
return v if v.is_a?(Date) || v.is_a?(DateTime)
|
6
|
+
return v if v.is_a?(Date) || v.is_a?(DateTime) ||
|
7
|
+
v.kind_of?(NilClass) || v.kind_of?(TrueClass) || v.kind_of?(FalseClass) || v.kind_of?(Numeric)
|
7
8
|
|
8
9
|
if v.to_s[(/\A(((19|20)\d\d[- \/.](0[1-9]|1[012]|[1-9])[- \/.](0[1-9]|[12][0-9]|3[01]|[1-9]))|((0[1-9]|1[012]|[1-9])[- \/.](0[1-9]|[12][0-9]|3[01]|[1-9])[- \/.](19|20)\d\d))\Z/)]
|
9
10
|
Date.parse(v) rescue v
|
data/lib/flexirest/request.rb
CHANGED
@@ -656,40 +656,52 @@ module Flexirest
|
|
656
656
|
k = k.to_sym
|
657
657
|
end
|
658
658
|
overridden_name = select_name(k, overridden_name)
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
659
|
+
set_corresponding_value(v, k, object, overridden_name)
|
660
|
+
end
|
661
|
+
object.clean! unless object_is_class?
|
662
|
+
|
663
|
+
object
|
664
|
+
end
|
665
|
+
|
666
|
+
def set_corresponding_value(value, key = nil, object = nil, overridden_name = nil)
|
667
|
+
optional_args = [key, object, overridden_name]
|
668
|
+
value_from_object = optional_args.all? # trying to parse a JSON Hash value
|
669
|
+
value_from_other_type = optional_args.none? # trying to parse anything else
|
670
|
+
raise Flexirest::InvalidArgumentsException.new("Optional args need all to be filled or none") unless value_from_object || value_from_other_type
|
671
|
+
k = key || :key
|
672
|
+
v = value
|
673
|
+
assignable_hash = value_from_object ? object._attributes : {}
|
674
|
+
if value_from_object && @method[:options][:lazy].include?(k)
|
675
|
+
assignable_hash[k] = Flexirest::LazyAssociationLoader.new(overridden_name, v, self, overridden_name:(overridden_name))
|
676
|
+
elsif v.is_a? Hash
|
677
|
+
assignable_hash[k] = new_object(v, overridden_name )
|
678
|
+
elsif v.is_a? Array
|
679
|
+
if @method[:options][:array].include?(k)
|
680
|
+
assignable_hash[k] = Array.new
|
676
681
|
else
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
object._attributes[k] = v
|
683
|
-
elsif Flexirest::Base.disable_automatic_date_parsing
|
684
|
-
object._attributes[k] = v
|
682
|
+
assignable_hash[k] = Flexirest::ResultIterator.new
|
683
|
+
end
|
684
|
+
v.each do |item|
|
685
|
+
if item.is_a? Hash
|
686
|
+
assignable_hash[k] << new_object(item, overridden_name)
|
685
687
|
else
|
686
|
-
|
688
|
+
assignable_hash[k] << set_corresponding_value(item)
|
687
689
|
end
|
688
690
|
end
|
691
|
+
else
|
692
|
+
parse_fields = [ @method[:options][:parse_fields], @object._date_fields ].compact.reduce([], :|)
|
693
|
+
parse_fields = nil if parse_fields.empty?
|
694
|
+
if (parse_fields && parse_fields.include?(k))
|
695
|
+
assignable_hash[k] = parse_attribute_value(v)
|
696
|
+
elsif parse_fields
|
697
|
+
assignable_hash[k] = v
|
698
|
+
elsif Flexirest::Base.disable_automatic_date_parsing
|
699
|
+
assignable_hash[k] = v
|
700
|
+
else
|
701
|
+
assignable_hash[k] = parse_attribute_value(v)
|
702
|
+
end
|
689
703
|
end
|
690
|
-
object
|
691
|
-
|
692
|
-
object
|
704
|
+
value_from_object ? object : assignable_hash[k]
|
693
705
|
end
|
694
706
|
|
695
707
|
def hal_response?
|
@@ -822,12 +834,10 @@ module Flexirest
|
|
822
834
|
|
823
835
|
def add_nested_body_to_iterator(result, items)
|
824
836
|
items.each do |json_object|
|
825
|
-
if json_object.is_a?
|
826
|
-
iterator = ResultIterator.new
|
827
|
-
add_nested_body_to_iterator(iterator, json_object)
|
828
|
-
result << iterator
|
829
|
-
else
|
837
|
+
if json_object.is_a? Hash
|
830
838
|
result << new_object(json_object, @overridden_name)
|
839
|
+
else
|
840
|
+
result << set_corresponding_value(json_object)
|
831
841
|
end
|
832
842
|
end
|
833
843
|
end
|
@@ -838,6 +848,7 @@ module Flexirest
|
|
838
848
|
end
|
839
849
|
|
840
850
|
class RequestException < StandardError ; end
|
851
|
+
class InvalidArgumentsException < StandardError ; end
|
841
852
|
|
842
853
|
class InvalidRequestException < RequestException ; end
|
843
854
|
class MissingParametersException < RequestException ; end
|
@@ -851,18 +862,19 @@ module Flexirest
|
|
851
862
|
end
|
852
863
|
|
853
864
|
class HTTPException < RequestException
|
854
|
-
attr_accessor :status, :result, :request_url
|
865
|
+
attr_accessor :status, :result, :request_url, :body, :raw_response
|
855
866
|
def initialize(options)
|
856
867
|
@status = options[:status]
|
857
868
|
@result = options[:result]
|
858
869
|
@request_url = options[:url]
|
859
|
-
@
|
870
|
+
@body = options[:raw_response]
|
860
871
|
@method = options[:method]
|
861
872
|
end
|
873
|
+
alias_method :body, :raw_response
|
862
874
|
|
863
875
|
def message
|
864
876
|
method = @method.try(:upcase)
|
865
|
-
"The #{method} to '#{@request_url}' returned a #{@status} status, which raised a #{self.class.to_s} with a body of: #{@
|
877
|
+
"The #{method} to '#{@request_url}' returned a #{@status} status, which raised a #{self.class.to_s} with a body of: #{@body}"
|
866
878
|
end
|
867
879
|
|
868
880
|
def to_s
|
data/lib/flexirest/version.rb
CHANGED
data/spec/lib/request_spec.rb
CHANGED
@@ -31,6 +31,8 @@ describe Flexirest::Request do
|
|
31
31
|
get :flat, "/", params_encoder: :flat
|
32
32
|
get :array, "/johnny", array: [:likes, :dislikes]
|
33
33
|
get :babies, "/babies", has_many: {children: ExampleOtherClient}
|
34
|
+
get :basket, "/basket", array: [:options]
|
35
|
+
get :dates, "/dates", array: [:dates]
|
34
36
|
get :single_association, "/single", has_one: {single: ExampleSingleClient}, has_many: {children: ExampleOtherClient}
|
35
37
|
get :headers, "/headers"
|
36
38
|
get :cancel_callback, "/cancel-callback"
|
@@ -38,6 +40,7 @@ describe Flexirest::Request do
|
|
38
40
|
put :headers_json, "/headers_json", request_body_type: :json
|
39
41
|
get :find, "/:id", required: [:id]
|
40
42
|
get :find_cat, "/:id/cat"
|
43
|
+
get :fruits, "/fruits"
|
41
44
|
get :change, "/change"
|
42
45
|
get :plain, "/plain/:id", plain: true
|
43
46
|
post :create, "/create", rubify_names: true
|
@@ -46,11 +49,14 @@ describe Flexirest::Request do
|
|
46
49
|
put :update, "/put/:id"
|
47
50
|
put :wrapped, "/put/:id", wrap_root: "example"
|
48
51
|
put :conversion, "/put/:id", parse_fields: [:converted]
|
52
|
+
put :conversion_child, "/put/:id", parse_fields: [:converted_child]
|
49
53
|
delete :remove, "/remove/:id"
|
50
54
|
delete :remove_body, "/remove/:id", send_delete_body: true
|
51
55
|
get :hal, "/hal", fake:"{\"_links\":{\"child\": {\"href\": \"/child/1\"}, \"other\": {\"href\": \"/other/1\"}, \"cars\":[{\"href\": \"/car/1\", \"name\":\"car1\"}, {\"href\": \"/car/2\", \"name\":\"car2\"}, {\"href\": \"/car/not-embed\", \"name\":\"car_not_embed\"} ], \"lazy\": {\"href\": \"/lazy/load\"}, \"invalid\": [{\"href\": \"/invalid/1\"}]}, \"_embedded\":{\"other\":{\"name\":\"Jane\"},\"child\":{\"name\":\"Billy\"}, \"cars\":[{\"_links\": {\"self\": {\"href\": \"/car/1\"} }, \"make\": \"Bugatti\", \"model\": \"Veyron\"}, {\"_links\": {\"self\": {\"href\": \"/car/2\"} }, \"make\": \"Ferrari\", \"model\": \"F458 Italia\"} ], \"invalid\": [{\"present\":true, \"_links\": {} } ] } }", has_many:{other:ExampleOtherClient}
|
52
|
-
get :
|
53
|
-
get :
|
56
|
+
get :fake_object, "/fake", fake:"{\"result\":true, \"list\":[1,2,3,{\"test\":true}], \"child\":{\"grandchild\":{\"test\":true}}}"
|
57
|
+
get :fake_proc_object, "/fake", fake:->(request) { "{\"result\":#{request.get_params[:id]}}" }
|
58
|
+
get :fake_array, "/fake", fake:"[1,2,3,{\"test\":true},null]"
|
59
|
+
get :fake_proc_array, "/fake", fake:->(request) { "[{\"result\":#{request.get_params[:id]}},null]" }
|
54
60
|
get :defaults, "/defaults", defaults:{overwrite:"no", persist:"yes"}
|
55
61
|
get :requires, "/requires", requires:[:name, :age]
|
56
62
|
patch :only_changed_1, "/changed1", only_changed: true
|
@@ -143,7 +149,8 @@ describe Flexirest::Request do
|
|
143
149
|
class LazyLoadedExampleClient < ExampleClient
|
144
150
|
base_url "http://www.example.com"
|
145
151
|
lazy_load!
|
146
|
-
get :
|
152
|
+
get :fake_object, "/fake", fake:"{\"result\":true, \"list\":[1,2,3,{\"test\":true}], \"child\":{\"grandchild\":{\"test\":true}}}"
|
153
|
+
get :fake_array, "/fake", fake:"[1,2,3,{\"test\":true},{\"child\":{\"grandchild\":{\"test\":true}}}]"
|
147
154
|
get :lazy_test, "/does-not-matter", fake:"{\"people\":[\"http://www.example.com/some/url\"]}", lazy: [:people]
|
148
155
|
end
|
149
156
|
|
@@ -190,7 +197,8 @@ describe Flexirest::Request do
|
|
190
197
|
class WhitelistedDateClient < Flexirest::Base
|
191
198
|
base_url "http://www.example.com"
|
192
199
|
put :conversion, "/put/:id"
|
193
|
-
|
200
|
+
put :conversion_child, "/put/:id"
|
201
|
+
parse_date :converted, :converted_child
|
194
202
|
end
|
195
203
|
|
196
204
|
allow_any_instance_of(Flexirest::Request).to receive(:read_cached_response)
|
@@ -511,33 +519,84 @@ describe Flexirest::Request do
|
|
511
519
|
end
|
512
520
|
end
|
513
521
|
|
514
|
-
it "should only convert date times in JSON if specified" do
|
522
|
+
it "should only convert date times in JSON if specified when converted is root property" do
|
515
523
|
expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", "debug=true", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"converted\":\"2012-03-04T01:02:03Z\", \"not_converted\":\"2012-03-04T01:02:03Z\"}", response_headers:{})))
|
516
524
|
object = ExampleClient.conversion id:1234, debug:true
|
517
525
|
expect(object.converted).to be_an_instance_of(DateTime)
|
518
526
|
expect(object.not_converted).to be_an_instance_of(String)
|
519
527
|
end
|
520
528
|
|
521
|
-
it "should convert date times in JSON if
|
529
|
+
it "should only convert date times in JSON if specified when converted is child property" do
|
530
|
+
expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", "debug=true", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"not_converted\":\"2012-03-04T01:02:03Z\", \"child\":{\"converted_child\":\"2012-03-04T01:02:03Z\"}}", response_headers:{})))
|
531
|
+
object = ExampleClient.conversion_child id:1234, debug:true
|
532
|
+
expect(object.child.converted_child).to be_an_instance_of(DateTime)
|
533
|
+
expect(object.not_converted).to be_an_instance_of(String)
|
534
|
+
end
|
535
|
+
|
536
|
+
it "should convert date times in JSON if root property is whitelisted" do
|
522
537
|
expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", "debug=true", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"converted\":\"2012-03-04T01:02:03Z\", \"not_converted\":\"2012-03-04T01:02:03Z\"}", response_headers:{})))
|
523
538
|
object = WhitelistedDateClient.conversion id:1234, debug:true
|
524
539
|
expect(object.converted).to be_an_instance_of(DateTime)
|
525
540
|
expect(object.not_converted).to be_an_instance_of(String)
|
526
541
|
end
|
527
542
|
|
528
|
-
it "should
|
529
|
-
|
543
|
+
it "should convert date times in JSON if child property is whitelisted" do
|
544
|
+
expect_any_instance_of(Flexirest::Connection).to receive(:put).with("/put/1234", "debug=true", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"not_converted\":\"2012-03-04T01:02:03Z\", \"child\":{\"converted_child\":\"2012-03-04T01:02:03Z\"}}", response_headers:{})))
|
545
|
+
object = WhitelistedDateClient.conversion_child id:1234, debug:true
|
546
|
+
expect(object.child.converted_child).to be_an_instance_of(DateTime)
|
547
|
+
expect(object.not_converted).to be_an_instance_of(String)
|
548
|
+
end
|
549
|
+
|
550
|
+
it "should convert date times in JSON from a result iterator response" do
|
551
|
+
expect_any_instance_of(Flexirest::Connection).to receive(:get).with("/dates", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"[\"2012-03-04T01:02:03Z\", \"2012-03-04T01:02:03Z\"]", response_headers:{})))
|
552
|
+
object = ExampleClient.dates
|
553
|
+
expect(object).to be_a(Flexirest::ResultIterator)
|
554
|
+
expect(object.items).to be_a(Array)
|
555
|
+
expect(object.first).to be_an_instance_of(DateTime)
|
556
|
+
end
|
557
|
+
|
558
|
+
it "should convert date times in JSON even in a pure array" do
|
559
|
+
expect_any_instance_of(Flexirest::Connection).to receive(:get).with("/dates", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"dates\":[\"2012-03-04T01:02:03Z\", \"2012-03-04T01:02:03Z\"]}", response_headers:{})))
|
560
|
+
object = ExampleClient.dates
|
561
|
+
expect(object).to be_a(ExampleClient)
|
562
|
+
expect(object.dates).to be_a(Array)
|
563
|
+
expect(object.dates.first).to be_an_instance_of(DateTime)
|
564
|
+
end
|
565
|
+
|
566
|
+
it "should parse JSON object and return a nice object for faked responses" do
|
567
|
+
object = ExampleClient.fake_object id:1234, debug:true
|
530
568
|
expect(object.result).to eq(true)
|
531
569
|
expect(object.list.first).to eq(1)
|
532
570
|
expect(object.list.last.test).to eq(true)
|
533
571
|
expect(object.child.grandchild.test).to eq(true)
|
534
572
|
end
|
535
573
|
|
536
|
-
it "should parse JSON from a fake response generated by a proc" do
|
537
|
-
object = ExampleClient.
|
574
|
+
it "should parse JSON object from a fake response generated by a proc" do
|
575
|
+
object = ExampleClient.fake_proc_object id:1234
|
538
576
|
expect(object.result).to eq(1234)
|
539
577
|
end
|
540
578
|
|
579
|
+
it "should parse JSON array and return a nice result iterator for faked responses" do
|
580
|
+
object = ExampleClient.fake_array debug:true
|
581
|
+
expect(object).to be_instance_of(Flexirest::ResultIterator)
|
582
|
+
expect(object.size).to eq(5)
|
583
|
+
expect(object.first).to eq(1)
|
584
|
+
expect(object.last).to eq(nil)
|
585
|
+
expect(object[3]).to be_instance_of(ExampleClient)
|
586
|
+
expect(object[3].test).to eq(true)
|
587
|
+
expect(object._status).to eq(200)
|
588
|
+
end
|
589
|
+
|
590
|
+
it "should parse JSON array from a fake response generated by a proc" do
|
591
|
+
object = ExampleClient.fake_proc_array id:1234
|
592
|
+
expect(object).to be_instance_of(Flexirest::ResultIterator)
|
593
|
+
expect(object.size).to eq(2)
|
594
|
+
expect(object.first).to be_instance_of(ExampleClient)
|
595
|
+
expect(object.first.result).to eq(1234)
|
596
|
+
expect(object.last).to eq(nil)
|
597
|
+
expect(object._status).to eq(200)
|
598
|
+
end
|
599
|
+
|
541
600
|
it "should not parse JSON from a plain request" do
|
542
601
|
response_body = "This is another non-JSON string"
|
543
602
|
expect_any_instance_of(Flexirest::Connection).to receive(:get).with(any_args).and_return(::FaradayResponseMock.new(OpenStruct.new(status:200, response_headers:{}, body:response_body)))
|
@@ -570,19 +629,36 @@ describe Flexirest::Request do
|
|
570
629
|
expect(ExampleClient.all).to be_truthy
|
571
630
|
end
|
572
631
|
|
573
|
-
it "should return a lazy loader object if lazy loading is enabled" do
|
574
|
-
object = LazyLoadedExampleClient.
|
632
|
+
it "should return a lazy loader object if lazy loading is enabled for JSON object" do
|
633
|
+
object = LazyLoadedExampleClient.fake_object id:1234, debug:true
|
575
634
|
expect(object).to be_an_instance_of(Flexirest::LazyLoader)
|
576
635
|
end
|
577
636
|
|
578
|
-
it "should proxy through nice object for lazy loaded responses" do
|
579
|
-
object = LazyLoadedExampleClient.
|
580
|
-
expect(object.result).to
|
637
|
+
it "should proxy through nice object for lazy loaded responses from JSON object" do
|
638
|
+
object = LazyLoadedExampleClient.fake_object id:1234, debug:true
|
639
|
+
expect(object.instance_variable_get(:@result)).to be(nil)
|
640
|
+
expect(object.result).to eq(true) # method call the attribute received in response and never the instance attribute of the LazyLoader class
|
641
|
+
expect(object.instance_variable_get(:@result)).to be_a(LazyLoadedExampleClient)
|
581
642
|
expect(object.list.first).to eq(1)
|
582
643
|
expect(object.list.last.test).to eq(true)
|
583
644
|
expect(object.child.grandchild.test).to eq(true)
|
584
645
|
end
|
585
646
|
|
647
|
+
it "should return a lazy loader object if lazy loading is enabled for JSON array" do
|
648
|
+
object = LazyLoadedExampleClient.fake_array debug:true
|
649
|
+
expect(object).to be_an_instance_of(Flexirest::LazyLoader)
|
650
|
+
end
|
651
|
+
|
652
|
+
it "should proxy through nice result iterator for lazy loaded responses from JSON array" do
|
653
|
+
object = LazyLoadedExampleClient.fake_array debug:true
|
654
|
+
expect(object.instance_variable_get(:@result)).to be(nil)
|
655
|
+
expect(object.items).to be_a(Array)
|
656
|
+
expect(object.instance_variable_get(:@result)).to be_a(Flexirest::ResultIterator)
|
657
|
+
expect(object.first).to eq(1)
|
658
|
+
expect(object[3].test).to eq(true)
|
659
|
+
expect(object.last.child.grandchild.test).to eq(true)
|
660
|
+
end
|
661
|
+
|
586
662
|
it "should return a LazyAssociationLoader for lazy loaded properties" do
|
587
663
|
object = LazyLoadedExampleClient.lazy_test
|
588
664
|
expect(object.people.size).to eq(1)
|
@@ -592,7 +668,7 @@ describe Flexirest::Request do
|
|
592
668
|
it "should log faked responses" do
|
593
669
|
allow(Flexirest::Logger).to receive(:debug)
|
594
670
|
expect(Flexirest::Logger).to receive(:debug).with(/Faked response found/)
|
595
|
-
ExampleClient.
|
671
|
+
ExampleClient.fake_object id:1234, debug:true
|
596
672
|
end
|
597
673
|
|
598
674
|
it "should parse an array within JSON to be a result iterator" do
|
@@ -628,6 +704,51 @@ describe Flexirest::Request do
|
|
628
704
|
#TODO
|
629
705
|
end
|
630
706
|
|
707
|
+
it "should parse an attribute to be an array if attribute included in a nested array" do
|
708
|
+
expect_any_instance_of(Flexirest::Connection).to receive(:get).with("/johnny", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"first_name\":\"Johnny\", \"nested_array\":[[{\"likes\":[\"donuts\", \"bacon\"], \"dislikes\":[\"politicians\", \"lawyers\", \"taxes\"]}]]}", status:200, response_headers:{})))
|
709
|
+
object = ExampleClient.array
|
710
|
+
nested_array = object.nested_array[0][0]
|
711
|
+
expect(nested_array.likes).to be_instance_of(Array)
|
712
|
+
expect(nested_array.likes.size).to eq(2)
|
713
|
+
expect(nested_array.likes[0]).to eq("donuts")
|
714
|
+
expect(nested_array.likes[1]).to eq("bacon")
|
715
|
+
expect(nested_array.dislikes).to be_instance_of(Array)
|
716
|
+
expect(nested_array.dislikes.size).to eq(3)
|
717
|
+
expect(nested_array.dislikes[0]).to eq("politicians")
|
718
|
+
expect(nested_array.dislikes[1]).to eq("lawyers")
|
719
|
+
expect(nested_array.dislikes[2]).to eq("taxes")
|
720
|
+
#TODO - Pasted from the Test above
|
721
|
+
end
|
722
|
+
|
723
|
+
it "should parse an attribute to be either a result iterator or an array and containing simple values like integers" do
|
724
|
+
expect_any_instance_of(Flexirest::Connection).to receive(:get).with("/basket", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"{\"products\":[101, 55, 37], \"options\":[854, 225, 772]}", status:200, response_headers:{})))
|
725
|
+
object = ExampleClient.basket
|
726
|
+
expect(object).to be_instance_of(ExampleClient)
|
727
|
+
expect(object.products).to be_a(Flexirest::ResultIterator)
|
728
|
+
expect(object.products.size).to eq(3)
|
729
|
+
expect(object.products.first).to eq(101)
|
730
|
+
expect(object.products[1]).to eq(55)
|
731
|
+
expect(object.products.last).to eq(37)
|
732
|
+
expect(object.options).to be_a(Array)
|
733
|
+
expect(object.options.size).to eq(3)
|
734
|
+
expect(object.options.first).to eq(854)
|
735
|
+
expect(object.options[1]).to eq(225)
|
736
|
+
expect(object.options.last).to eq(772)
|
737
|
+
expect(object._status).to eq(200)
|
738
|
+
#TODO - Pasted from the Test above
|
739
|
+
end
|
740
|
+
|
741
|
+
it "should parse the response to be a result iterator and containing simple values like strings" do
|
742
|
+
expect_any_instance_of(Flexirest::Connection).to receive(:get).with("/fruits", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"[\"apple\", \"banana\", \"pear\", \"watermelon\"]", status:200, response_headers:{})))
|
743
|
+
object = ExampleClient.fruits
|
744
|
+
expect(object).to be_instance_of(Flexirest::ResultIterator)
|
745
|
+
expect(object.first).to eq('apple')
|
746
|
+
expect(object[1]).to eq('banana')
|
747
|
+
expect(object.last).to eq('watermelon')
|
748
|
+
expect(object._status).to eq(200)
|
749
|
+
#TODO - Pasted from the Test above
|
750
|
+
end
|
751
|
+
|
631
752
|
it "should only send changed attributes if only_changed:true" do
|
632
753
|
expect_any_instance_of(Flexirest::Connection).to receive(:patch).with("/changed1", "debug=true", an_instance_of(Hash)).and_return(::FaradayResponseMock.new(OpenStruct.new(body:"[{\"first_name\":\"Johnny\"}, {\"first_name\":\"Billy\"}, {\"debug\":\"true\"}]", status:200, response_headers:{})))
|
633
754
|
object = ExampleClient.new
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flexirest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.9.
|
4
|
+
version: 1.9.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Jeffries
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|