acfs 1.0.0.dev.1.b305 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/CHANGELOG.md +64 -0
- data/README.md +2 -2
- data/acfs.gemspec +4 -4
- data/lib/acfs.rb +7 -5
- data/lib/acfs/adapter/base.rb +0 -2
- data/lib/acfs/adapter/typhoeus.rb +17 -13
- data/lib/acfs/collections/paginatable.rb +10 -10
- data/lib/acfs/configuration.rb +4 -5
- data/lib/acfs/errors.rb +10 -9
- data/lib/acfs/global.rb +16 -7
- data/lib/acfs/location.rb +11 -11
- data/lib/acfs/middleware/base.rb +1 -2
- data/lib/acfs/middleware/json.rb +27 -0
- data/lib/acfs/middleware/logger.rb +0 -2
- data/lib/acfs/middleware/msgpack.rb +30 -0
- data/lib/acfs/middleware/print.rb +0 -2
- data/lib/acfs/middleware/serializer.rb +39 -0
- data/lib/acfs/operation.rb +5 -5
- data/lib/acfs/request.rb +4 -4
- data/lib/acfs/request/callbacks.rb +2 -3
- data/lib/acfs/resource.rb +2 -2
- data/lib/acfs/resource/attributes.rb +10 -37
- data/lib/acfs/resource/attributes/base.rb +10 -19
- data/lib/acfs/resource/attributes/boolean.rb +10 -8
- data/lib/acfs/resource/attributes/date_time.rb +6 -9
- data/lib/acfs/resource/attributes/dict.rb +37 -0
- data/lib/acfs/resource/attributes/float.rb +11 -5
- data/lib/acfs/resource/attributes/integer.rb +7 -5
- data/lib/acfs/resource/attributes/list.rb +13 -6
- data/lib/acfs/resource/attributes/string.rb +3 -5
- data/lib/acfs/resource/attributes/uuid.rb +8 -17
- data/lib/acfs/resource/loadable.rb +0 -1
- data/lib/acfs/resource/locatable.rb +0 -4
- data/lib/acfs/resource/operational.rb +0 -2
- data/lib/acfs/resource/persistence.rb +17 -17
- data/lib/acfs/resource/query_methods.rb +3 -5
- data/lib/acfs/resource/service.rb +0 -2
- data/lib/acfs/resource/validation.rb +0 -2
- data/lib/acfs/response.rb +1 -2
- data/lib/acfs/response/formats.rb +1 -2
- data/lib/acfs/response/status.rb +3 -5
- data/lib/acfs/runner.rb +21 -11
- data/lib/acfs/service.rb +4 -6
- data/lib/acfs/service/middleware.rb +20 -30
- data/lib/acfs/service/middleware/stack.rb +63 -0
- data/lib/acfs/singleton_resource.rb +0 -2
- data/lib/acfs/stub.rb +30 -21
- data/lib/acfs/util.rb +1 -1
- data/lib/acfs/version.rb +4 -2
- data/spec/acfs/adapter/typhoeus_spec.rb +12 -4
- data/spec/acfs/collection_spec.rb +45 -33
- data/spec/acfs/configuration_spec.rb +9 -1
- data/spec/acfs/global_spec.rb +21 -3
- data/spec/acfs/middleware/json_spec.rb +63 -0
- data/spec/acfs/middleware/msgpack_spec.rb +60 -0
- data/spec/acfs/operation_spec.rb +10 -0
- data/spec/acfs/request/callbacks_spec.rb +8 -8
- data/spec/acfs/request_spec.rb +5 -5
- data/spec/acfs/resource/attributes/boolean_spec.rb +40 -9
- data/spec/acfs/resource/attributes/date_time_spec.rb +29 -35
- data/spec/acfs/resource/attributes/dict_spec.rb +75 -0
- data/spec/acfs/resource/attributes/float_spec.rb +48 -9
- data/spec/acfs/resource/attributes/integer_spec.rb +34 -0
- data/spec/acfs/resource/attributes/list_spec.rb +43 -19
- data/spec/acfs/resource/attributes/uuid_spec.rb +31 -54
- data/spec/acfs/resource/attributes_spec.rb +17 -31
- data/spec/acfs/resource/locatable_spec.rb +2 -2
- data/spec/acfs/resource/persistance_spec.rb +65 -34
- data/spec/acfs/resource/query_methods_spec.rb +87 -87
- data/spec/acfs/resource/validation_spec.rb +4 -5
- data/spec/acfs/response/formats_spec.rb +1 -1
- data/spec/acfs/response/status_spec.rb +1 -1
- data/spec/acfs/runner_spec.rb +28 -3
- data/spec/acfs/service/middleware_spec.rb +4 -20
- data/spec/acfs/service_spec.rb +3 -5
- data/spec/acfs/singleton_resource_spec.rb +1 -2
- data/spec/acfs/stub_spec.rb +137 -22
- data/spec/acfs_spec.rb +22 -19
- data/spec/spec_helper.rb +2 -1
- data/spec/support/service.rb +10 -6
- data/spec/support/shared/find_callbacks.rb +7 -7
- metadata +37 -30
- data/lib/acfs/middleware/json_decoder.rb +0 -16
- data/lib/acfs/middleware/json_encoder.rb +0 -20
- data/lib/acfs/middleware/msgpack_decoder.rb +0 -26
- data/lib/acfs/middleware/msgpack_encoder.rb +0 -19
- data/spec/acfs/middleware/json_decoder_spec.rb +0 -45
- data/spec/acfs/middleware/msgpack_decoder_spec.rb +0 -36
data/lib/acfs/service.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'acfs/service/middleware'
|
2
2
|
|
3
3
|
module Acfs
|
4
|
-
|
5
4
|
# User {Acfs::Service} to define your services. That includes
|
6
5
|
# an identity used to identify the service in configuration files
|
7
6
|
# and middlewares the service uses.
|
@@ -35,14 +34,14 @@ module Acfs
|
|
35
34
|
# @return [Location]
|
36
35
|
#
|
37
36
|
def location(resource_class, opts = {})
|
38
|
-
opts.reverse_merge!
|
37
|
+
opts.reverse_merge! options
|
39
38
|
|
40
39
|
action = opts[:action] || :list
|
41
40
|
|
42
|
-
path = if
|
41
|
+
path = if opts[:path].is_a?(Hash) && opts[:path].key?(action)
|
43
42
|
opts[:path].fetch(action)
|
44
43
|
else
|
45
|
-
path = if
|
44
|
+
path = if opts[:path].is_a?(Hash)
|
46
45
|
opts[:path][:all].to_s
|
47
46
|
else
|
48
47
|
opts[:path].to_s
|
@@ -59,7 +58,6 @@ module Acfs
|
|
59
58
|
end
|
60
59
|
|
61
60
|
class << self
|
62
|
-
|
63
61
|
# @api public
|
64
62
|
#
|
65
63
|
# @overload identity()
|
@@ -83,7 +81,7 @@ module Acfs
|
|
83
81
|
#
|
84
82
|
def base_url
|
85
83
|
unless (base = Acfs::Configuration.current.locate identity)
|
86
|
-
raise ArgumentError
|
84
|
+
raise ArgumentError.new "#{identity} not configured. Add `locate '#{identity.to_s.underscore}', 'http://service.url/'` to your configuration."
|
87
85
|
end
|
88
86
|
|
89
87
|
base.to_s
|
@@ -1,6 +1,7 @@
|
|
1
|
+
require 'acfs/service/middleware/stack'
|
2
|
+
|
1
3
|
module Acfs
|
2
4
|
class Service
|
3
|
-
|
4
5
|
# Module providing all function to register middlewares
|
5
6
|
# on services and process queued request through the
|
6
7
|
# middleware stack.
|
@@ -16,28 +17,25 @@ module Acfs
|
|
16
17
|
end
|
17
18
|
|
18
19
|
module ClassMethods
|
19
|
-
|
20
|
-
#
|
20
|
+
# @!method use(klass, *args, &block)
|
21
|
+
# @api public
|
21
22
|
#
|
22
|
-
#
|
23
|
+
# Register a new middleware to be used for this service.
|
23
24
|
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
25
|
+
# @example
|
26
|
+
# class MyService < Acfs::Service
|
27
|
+
# self.base_url = 'http://my.srv'
|
28
|
+
# use Acfs::Middleware::JSON
|
29
|
+
# end
|
29
30
|
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
31
|
+
# @param [Class] klass Middleware class to append
|
32
|
+
# @param [Array<Object>] args Arguments passed to klass initialize
|
33
|
+
# @param [Proc] block Block passed to klass initialize
|
34
|
+
# @return [undefined]
|
33
35
|
#
|
34
|
-
def use(klass,
|
35
|
-
|
36
|
-
|
37
|
-
return false if @middlewares.include? klass
|
38
|
-
|
39
|
-
@middlewares << klass
|
40
|
-
@middleware = klass.new(middleware, options)
|
36
|
+
def use(klass, *args, &block)
|
37
|
+
# Backward compatible behavior
|
38
|
+
middleware.insert(0, klass, *args, &block)
|
41
39
|
end
|
42
40
|
|
43
41
|
# @api private
|
@@ -47,19 +45,11 @@ module Acfs
|
|
47
45
|
# @return [#call]
|
48
46
|
#
|
49
47
|
def middleware
|
50
|
-
@middleware ||=
|
48
|
+
@middleware ||= Stack.new
|
51
49
|
end
|
52
50
|
|
53
|
-
# @
|
54
|
-
|
55
|
-
# Clear all registered middlewares.
|
56
|
-
#
|
57
|
-
# @return [undefined]
|
58
|
-
#
|
59
|
-
def clear
|
60
|
-
@middleware = nil
|
61
|
-
@middlewares = []
|
62
|
-
end
|
51
|
+
# @deprecated
|
52
|
+
delegate :clear, to: :middleware
|
63
53
|
end
|
64
54
|
end
|
65
55
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Acfs
|
2
|
+
class Service
|
3
|
+
module Middleware
|
4
|
+
class Stack
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
MUTEX = Mutex.new
|
8
|
+
IDENTITY = -> (i) { i }
|
9
|
+
|
10
|
+
attr_reader :middlewares
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@middlewares = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(request)
|
17
|
+
build! unless @app
|
18
|
+
|
19
|
+
@app.call request
|
20
|
+
end
|
21
|
+
|
22
|
+
def build!
|
23
|
+
return if @app
|
24
|
+
|
25
|
+
MUTEX.synchronize do
|
26
|
+
return if @app
|
27
|
+
|
28
|
+
@app = build
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def build(app = IDENTITY)
|
33
|
+
middlewares.reverse.inject(app) do |next_middleware, current_middleware|
|
34
|
+
klass, args, block = current_middleware
|
35
|
+
args ||= []
|
36
|
+
|
37
|
+
if klass.is_a?(Class)
|
38
|
+
klass.new(next_middleware, *args, &block)
|
39
|
+
elsif klass.respond_to?(:call)
|
40
|
+
lambda do |env|
|
41
|
+
next_middleware.call(klass.call(env, *args))
|
42
|
+
end
|
43
|
+
else
|
44
|
+
fail "Invalid middleware, doesn't respond to `call`: #{klass.inspect}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def insert(index, klass, *args, &block)
|
50
|
+
middlewares.insert(index, [klass, args, block])
|
51
|
+
end
|
52
|
+
|
53
|
+
def each
|
54
|
+
middlewares.each { |x| yield x.first }
|
55
|
+
end
|
56
|
+
|
57
|
+
def clear
|
58
|
+
middlewares.clear
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Acfs
|
2
|
-
|
3
2
|
# Acfs SingletonResources
|
4
3
|
#
|
5
4
|
# Usage explanation:
|
@@ -14,7 +13,6 @@ module Acfs
|
|
14
13
|
# always only a single instance of the resource is being returned
|
15
14
|
#
|
16
15
|
class SingletonResource < Acfs::Resource
|
17
|
-
|
18
16
|
# @api public
|
19
17
|
#
|
20
18
|
# Destroy resource by sending a DELETE request.
|
data/lib/acfs/stub.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'rack/utils'
|
2
2
|
|
3
3
|
module Acfs
|
4
|
-
|
5
4
|
# Global handler for stubbing resources.
|
6
5
|
#
|
7
6
|
class Stub
|
@@ -14,7 +13,7 @@ module Acfs
|
|
14
13
|
|
15
14
|
@opts[:with].stringify_keys! if @opts[:with].is_a? Hash
|
16
15
|
@opts[:return].stringify_keys! if @opts[:return].is_a? Hash
|
17
|
-
@opts[:return].map! {
|
16
|
+
@opts[:return].map! {|h| h.stringify_keys! if h.is_a? Hash } if @opts[:return].is_a? Array
|
18
17
|
end
|
19
18
|
|
20
19
|
def accept?(op)
|
@@ -22,14 +21,21 @@ module Acfs
|
|
22
21
|
|
23
22
|
params = op.full_params.stringify_keys
|
24
23
|
data = op.data.stringify_keys
|
25
|
-
|
26
|
-
|
27
|
-
return true if
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
24
|
+
with = opts[:with]
|
25
|
+
|
26
|
+
return true if with.nil?
|
27
|
+
|
28
|
+
case opts.fetch(:match, :inclusion)
|
29
|
+
when :legacy
|
30
|
+
return true if with.empty? && params.empty? && data.empty?
|
31
|
+
return true if with.reject {|_, v| v.nil? } == params.reject {|_, v| v.nil? }
|
32
|
+
return true if with.reject {|_, v| v.nil? } == data.reject {|_, v| v.nil? }
|
33
|
+
false
|
34
|
+
when :inclusion
|
35
|
+
with.each_pair.all? do |k, v|
|
36
|
+
(params.key?(k) && params[k] == v) || (data.key?(k) && data[k] == v)
|
37
|
+
end
|
38
|
+
end
|
33
39
|
end
|
34
40
|
|
35
41
|
def calls
|
@@ -50,17 +56,20 @@ module Acfs
|
|
50
56
|
if err
|
51
57
|
raise_error op, err, opts[:return]
|
52
58
|
elsif data
|
59
|
+
data = data.call(op) if data.respond_to?(:call)
|
60
|
+
|
53
61
|
response = Acfs::Response.new op.request,
|
54
|
-
|
55
|
-
|
56
|
-
|
62
|
+
headers: opts[:headers] || {},
|
63
|
+
status: opts[:status] || 200,
|
64
|
+
data: data || {}
|
57
65
|
op.call data, response
|
58
66
|
else
|
59
|
-
raise ArgumentError
|
67
|
+
raise ArgumentError.new 'Unsupported stub.'
|
60
68
|
end
|
61
69
|
end
|
62
70
|
|
63
71
|
private
|
72
|
+
|
64
73
|
def raise_error(op, name, data)
|
65
74
|
raise name if name.is_a? Class
|
66
75
|
data.stringify_keys! if data.respond_to? :stringify_keys!
|
@@ -69,13 +78,12 @@ module Acfs
|
|
69
78
|
end
|
70
79
|
|
71
80
|
class << self
|
72
|
-
|
73
81
|
# Stub a resource with given handler block. An already created handler
|
74
82
|
# for same resource class will be overridden.
|
75
83
|
#
|
76
|
-
def resource(klass, action, opts = {}, &
|
84
|
+
def resource(klass, action, opts = {}, &_block)
|
77
85
|
action = action.to_sym
|
78
|
-
raise ArgumentError
|
86
|
+
raise ArgumentError.new "Unknown action `#{action}`." unless ACTIONS.include? action
|
79
87
|
|
80
88
|
Stub.new(opts).tap do |stub|
|
81
89
|
stubs[klass] ||= {}
|
@@ -96,11 +104,11 @@ module Acfs
|
|
96
104
|
@enabled ||= false
|
97
105
|
end
|
98
106
|
|
99
|
-
def enable
|
107
|
+
def enable
|
100
108
|
@enabled = true
|
101
109
|
end
|
102
110
|
|
103
|
-
def disable
|
111
|
+
def disable
|
104
112
|
@enabled = false
|
105
113
|
end
|
106
114
|
|
@@ -118,7 +126,7 @@ module Acfs
|
|
118
126
|
return false unless (classes = stubs[op.resource])
|
119
127
|
return false unless (stubs = classes[op.action])
|
120
128
|
|
121
|
-
accepted_stubs = stubs.select {
|
129
|
+
accepted_stubs = stubs.select {|stub| stub.accept? op }
|
122
130
|
|
123
131
|
raise AmbiguousStubError.new stubs: accepted_stubs, operation: op if accepted_stubs.size > 1
|
124
132
|
|
@@ -142,8 +150,9 @@ module Acfs
|
|
142
150
|
end
|
143
151
|
|
144
152
|
private
|
153
|
+
|
145
154
|
def pretty_print
|
146
|
-
out =
|
155
|
+
out = ''
|
147
156
|
stubs.each do |klass, actions|
|
148
157
|
out << ' ' << klass.name << ":\n"
|
149
158
|
actions.each do |action, stubs|
|
data/lib/acfs/util.rb
CHANGED
data/lib/acfs/version.rb
CHANGED
@@ -5,16 +5,24 @@ describe Acfs::Adapter::Typhoeus do
|
|
5
5
|
before { WebMock.allow_net_connect! }
|
6
6
|
|
7
7
|
it 'raises an error' do
|
8
|
-
request1 = Acfs::Request.new 'http://altimos.de/404.1' do |
|
8
|
+
request1 = Acfs::Request.new 'http://altimos.de/404.1' do |_rsp|
|
9
9
|
raise '404-1'
|
10
10
|
end
|
11
|
-
request2 = Acfs::Request.new 'http://altimos.de/404.2' do |
|
11
|
+
request2 = Acfs::Request.new 'http://altimos.de/404.2' do |_rsp|
|
12
12
|
raise '404-2'
|
13
13
|
end
|
14
14
|
adapter.queue request1
|
15
15
|
adapter.queue request2
|
16
16
|
|
17
|
-
expect{ adapter.start }.to raise_error
|
18
|
-
expect{ adapter.start }.to_not raise_error
|
17
|
+
expect { adapter.start }.to raise_error(/404\-[12]/)
|
18
|
+
expect { adapter.start }.to_not raise_error
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'passes arguments to typhoeus hydra' do
|
22
|
+
value = {key: 1, key2: 2}
|
23
|
+
|
24
|
+
expect(::Typhoeus::Hydra).to receive(:new).with(value)
|
25
|
+
|
26
|
+
described_class.new(**value).send :hydra
|
19
27
|
end
|
20
28
|
end
|
@@ -11,47 +11,59 @@ describe Acfs::Collection do
|
|
11
11
|
|
12
12
|
context 'without explicit page parameter' do
|
13
13
|
before do
|
14
|
-
stub_request(:get, 'http://users.example.org/users')
|
15
|
-
|
16
|
-
|
14
|
+
stub_request(:get, 'http://users.example.org/users')
|
15
|
+
.to_return response([{id: 1, name: 'Anon', age: 12, born_at: 'Berlin'}],
|
16
|
+
headers: {
|
17
|
+
'X-Total-Pages' => '2',
|
18
|
+
'X-Total-Count' => '10'
|
19
|
+
})
|
17
20
|
end
|
18
21
|
|
19
22
|
its(:total_pages) { should eq 2 }
|
20
23
|
its(:current_page) { should eq 1 }
|
24
|
+
its(:total_count) { should eq 10 }
|
21
25
|
end
|
22
26
|
|
23
27
|
context 'with page parameter' do
|
24
28
|
let(:params) { {page: 2} }
|
25
29
|
before do
|
26
|
-
stub_request(:get, 'http://users.example.org/users?page=2')
|
27
|
-
|
28
|
-
|
30
|
+
stub_request(:get, 'http://users.example.org/users?page=2')
|
31
|
+
.to_return response([{id: 1, name: 'Anon', age: 12, born_at: 'Berlin'}],
|
32
|
+
headers: {
|
33
|
+
'X-Total-Pages' => '2',
|
34
|
+
'X-Total-Count' => '10'
|
35
|
+
})
|
29
36
|
end
|
30
37
|
|
31
38
|
its(:total_pages) { should eq 2 }
|
32
39
|
its(:current_page) { should eq 2 }
|
40
|
+
its(:total_count) { should eq 10 }
|
33
41
|
end
|
34
42
|
|
35
43
|
context 'with non-numerical page parameter' do
|
36
44
|
let(:params) { {page: 'e546f5'} }
|
37
45
|
before do
|
38
|
-
stub_request(:get, 'http://users.example.org/users?page=e546f5')
|
39
|
-
|
40
|
-
|
46
|
+
stub_request(:get, 'http://users.example.org/users?page=e546f5')
|
47
|
+
.to_return response([{id: 1, name: 'Anon', age: 12, born_at: 'Berlin'}],
|
48
|
+
headers: {
|
49
|
+
'X-Total-Pages' => '2',
|
50
|
+
'X-Total-Count' => '10'
|
51
|
+
})
|
41
52
|
end
|
42
53
|
|
43
54
|
its(:total_pages) { should eq 2 }
|
44
55
|
its(:current_page) { should eq 'e546f5' }
|
56
|
+
its(:total_count) { should eq 10 }
|
45
57
|
end
|
46
58
|
|
47
59
|
describe '#next_page' do
|
48
60
|
before do
|
49
|
-
stub_request(:get, 'http://users.example.org/users')
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
61
|
+
stub_request(:get, 'http://users.example.org/users')
|
62
|
+
.to_return response([{id: 1, name: 'Anon', age: 12, born_at: 'Berlin'}],
|
63
|
+
headers: {
|
64
|
+
'X-Total-Pages' => '2',
|
65
|
+
'Link' => '<http://users.example.org/users?page=2>; rel="next"'
|
66
|
+
})
|
55
67
|
end
|
56
68
|
let!(:req) do
|
57
69
|
stub_request(:get, 'http://users.example.org/users?page=2').to_return response([])
|
@@ -70,12 +82,12 @@ describe Acfs::Collection do
|
|
70
82
|
|
71
83
|
describe '#prev_page' do
|
72
84
|
before do
|
73
|
-
stub_request(:get, 'http://users.example.org/users?page=2')
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
85
|
+
stub_request(:get, 'http://users.example.org/users?page=2')
|
86
|
+
.to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
|
87
|
+
headers: {
|
88
|
+
'X-Total-Pages' => '2',
|
89
|
+
'Link' => '<http://users.example.org/users>; rel="prev"'
|
90
|
+
})
|
79
91
|
end
|
80
92
|
let!(:req) do
|
81
93
|
stub_request(:get, 'http://users.example.org/users').to_return response([])
|
@@ -94,12 +106,12 @@ describe Acfs::Collection do
|
|
94
106
|
|
95
107
|
describe '#first_page' do
|
96
108
|
before do
|
97
|
-
stub_request(:get, 'http://users.example.org/users?page=2')
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
109
|
+
stub_request(:get, 'http://users.example.org/users?page=2')
|
110
|
+
.to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
|
111
|
+
headers: {
|
112
|
+
'X-Total-Pages' => '2',
|
113
|
+
'Link' => '<http://users.example.org/users>; rel="first"'
|
114
|
+
})
|
103
115
|
end
|
104
116
|
let!(:req) do
|
105
117
|
stub_request(:get, 'http://users.example.org/users').to_return response([])
|
@@ -118,12 +130,12 @@ describe Acfs::Collection do
|
|
118
130
|
|
119
131
|
describe '#last_page' do
|
120
132
|
before do
|
121
|
-
stub_request(:get, 'http://users.example.org/users?page=2')
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
133
|
+
stub_request(:get, 'http://users.example.org/users?page=2')
|
134
|
+
.to_return response([{id: 2, name: 'Anno', age: 1604, born_at: 'Santa Maria'}],
|
135
|
+
headers: {
|
136
|
+
'X-Total-Pages' => '2',
|
137
|
+
'Link' => '<http://users.example.org/users?page=12>; rel="last"'
|
138
|
+
})
|
127
139
|
end
|
128
140
|
let!(:req) do
|
129
141
|
stub_request(:get, 'http://users.example.org/users?page=12').to_return response([])
|