resourceful 0.3.1 → 0.5.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 (38) hide show
  1. data/Manifest +24 -28
  2. data/Rakefile +44 -14
  3. data/lib/resourceful.rb +11 -21
  4. data/lib/resourceful/authentication_manager.rb +3 -2
  5. data/lib/resourceful/cache_manager.rb +58 -1
  6. data/lib/resourceful/exceptions.rb +34 -0
  7. data/lib/resourceful/header.rb +95 -0
  8. data/lib/resourceful/http_accessor.rb +0 -2
  9. data/lib/resourceful/memcache_cache_manager.rb +3 -13
  10. data/lib/resourceful/net_http_adapter.rb +15 -5
  11. data/lib/resourceful/request.rb +180 -18
  12. data/lib/resourceful/resource.rb +38 -141
  13. data/lib/resourceful/response.rb +142 -95
  14. data/resourceful.gemspec +9 -7
  15. data/spec/acceptance/authorization_spec.rb +16 -0
  16. data/spec/acceptance/caching_spec.rb +192 -0
  17. data/spec/acceptance/header_spec.rb +24 -0
  18. data/spec/acceptance/redirecting_spec.rb +12 -0
  19. data/spec/acceptance/resource_spec.rb +84 -0
  20. data/spec/acceptance_shared_specs.rb +12 -17
  21. data/spec/{acceptance_spec.rb → old_acceptance_specs.rb} +27 -57
  22. data/spec/simple_sinatra_server.rb +74 -0
  23. data/spec/simple_sinatra_server_spec.rb +98 -0
  24. data/spec/spec_helper.rb +21 -7
  25. metadata +50 -42
  26. data/spec/resourceful/authentication_manager_spec.rb +0 -249
  27. data/spec/resourceful/cache_manager_spec.rb +0 -223
  28. data/spec/resourceful/header_spec.rb +0 -38
  29. data/spec/resourceful/http_accessor_spec.rb +0 -164
  30. data/spec/resourceful/memcache_cache_manager_spec.rb +0 -111
  31. data/spec/resourceful/net_http_adapter_spec.rb +0 -96
  32. data/spec/resourceful/options_interpreter_spec.rb +0 -102
  33. data/spec/resourceful/request_spec.rb +0 -186
  34. data/spec/resourceful/resource_spec.rb +0 -600
  35. data/spec/resourceful/response_spec.rb +0 -238
  36. data/spec/resourceful/stubbed_resource_proxy_spec.rb +0 -58
  37. data/spec/simple_http_server_shared_spec.rb +0 -162
  38. data/spec/simple_http_server_shared_spec_spec.rb +0 -212
data/spec/spec_helper.rb CHANGED
@@ -1,14 +1,28 @@
1
1
  require 'rubygems'
2
- require 'pathname'
3
2
  require 'spec'
4
- require 'pp'
5
- require 'facets'
6
3
 
7
- $LOAD_PATH << Pathname(__FILE__).dirname + "../lib"
8
- require 'resourceful/util'
4
+ $LOAD_PATH << File.join(File.dirname(__FILE__), "..", "lib")
9
5
  require 'resourceful'
10
- require 'resourceful/http_accessor'
11
6
 
12
- require Pathname(__FILE__).dirname + 'simple_http_server_shared_spec'
7
+ $LOAD_PATH << File.dirname(__FILE__) # ./spec
13
8
 
9
+ # Spawn the server in another process
10
+
11
+ @server = Thread.new do
12
+
13
+ require 'simple_sinatra_server'
14
+ Sinatra::Default.set(
15
+ :run => true,
16
+ :logging => false
17
+ )
18
+
19
+ end
20
+
21
+ # Kill the server process when rspec finishes
22
+ at_exit { @server.exit }
23
+
24
+
25
+ # Give the app a change to initialize
26
+ $stderr.puts "Waiting for thin to initialize..."
27
+ sleep 0.2
14
28
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resourceful
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Sadauskas
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-05 00:00:00 -07:00
12
+ date: 2009-07-13 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -82,6 +82,16 @@ dependencies:
82
82
  - !ruby/object:Gem::Version
83
83
  version: "0"
84
84
  version:
85
+ - !ruby/object:Gem::Dependency
86
+ name: sinatra
87
+ type: :development
88
+ version_requirement:
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: "0"
94
+ version:
85
95
  description: An HTTP library for Ruby that takes advantage of everything HTTP has to offer.
86
96
  email: psadauskas@gmail.com
87
97
  executables: []
@@ -89,58 +99,56 @@ executables: []
89
99
  extensions: []
90
100
 
91
101
  extra_rdoc_files:
92
- - lib/resourceful.rb
93
- - lib/resourceful/authentication_manager.rb
94
- - lib/resourceful/util.rb
95
- - lib/resourceful/resource.rb
96
- - lib/resourceful/memcache_cache_manager.rb
102
+ - README.markdown
103
+ - lib/resourceful/cache_manager.rb
104
+ - lib/resourceful/exceptions.rb
97
105
  - lib/resourceful/net_http_adapter.rb
98
- - lib/resourceful/http_accessor.rb
99
106
  - lib/resourceful/stubbed_resource_proxy.rb
100
107
  - lib/resourceful/header.rb
101
- - lib/resourceful/cache_manager.rb
102
- - lib/resourceful/options_interpreter.rb
103
- - lib/resourceful/response.rb
104
- - lib/resourceful/request.rb
105
- - README.markdown
106
- files:
107
- - lib/resourceful.rb
108
108
  - lib/resourceful/authentication_manager.rb
109
- - lib/resourceful/util.rb
109
+ - lib/resourceful/request.rb
110
110
  - lib/resourceful/resource.rb
111
+ - lib/resourceful/response.rb
112
+ - lib/resourceful/util.rb
113
+ - lib/resourceful/http_accessor.rb
114
+ - lib/resourceful/options_interpreter.rb
111
115
  - lib/resourceful/memcache_cache_manager.rb
116
+ - lib/resourceful.rb
117
+ files:
118
+ - Manifest
119
+ - spec/spec.opts
120
+ - spec/simple_sinatra_server_spec.rb
121
+ - spec/simple_sinatra_server.rb
122
+ - spec/acceptance/header_spec.rb
123
+ - spec/acceptance/caching_spec.rb
124
+ - spec/acceptance/resource_spec.rb
125
+ - spec/acceptance/redirecting_spec.rb
126
+ - spec/acceptance/authorization_spec.rb
127
+ - spec/acceptance_shared_specs.rb
128
+ - spec/spec_helper.rb
129
+ - spec/old_acceptance_specs.rb
130
+ - README.markdown
131
+ - resourceful.gemspec
132
+ - lib/resourceful/cache_manager.rb
133
+ - lib/resourceful/exceptions.rb
112
134
  - lib/resourceful/net_http_adapter.rb
113
- - lib/resourceful/http_accessor.rb
114
135
  - lib/resourceful/stubbed_resource_proxy.rb
115
136
  - lib/resourceful/header.rb
116
- - lib/resourceful/cache_manager.rb
117
- - lib/resourceful/options_interpreter.rb
118
- - lib/resourceful/response.rb
137
+ - lib/resourceful/authentication_manager.rb
119
138
  - lib/resourceful/request.rb
120
- - spec/acceptance_shared_specs.rb
121
- - spec/spec.opts
122
- - spec/acceptance_spec.rb
123
- - spec/simple_http_server_shared_spec_spec.rb
124
- - spec/spec_helper.rb
125
- - spec/resourceful/header_spec.rb
126
- - spec/resourceful/authentication_manager_spec.rb
127
- - spec/resourceful/memcache_cache_manager_spec.rb
128
- - spec/resourceful/response_spec.rb
129
- - spec/resourceful/options_interpreter_spec.rb
130
- - spec/resourceful/http_accessor_spec.rb
131
- - spec/resourceful/stubbed_resource_proxy_spec.rb
132
- - spec/resourceful/request_spec.rb
133
- - spec/resourceful/resource_spec.rb
134
- - spec/resourceful/cache_manager_spec.rb
135
- - spec/resourceful/net_http_adapter_spec.rb
136
- - spec/simple_http_server_shared_spec.rb
137
- - Manifest
139
+ - lib/resourceful/resource.rb
140
+ - lib/resourceful/response.rb
141
+ - lib/resourceful/util.rb
142
+ - lib/resourceful/http_accessor.rb
143
+ - lib/resourceful/options_interpreter.rb
144
+ - lib/resourceful/memcache_cache_manager.rb
145
+ - lib/resourceful.rb
138
146
  - Rakefile
139
- - README.markdown
140
147
  - MIT-LICENSE
141
- - resourceful.gemspec
142
148
  has_rdoc: true
143
149
  homepage: http://github.com/paul/resourceful
150
+ licenses: []
151
+
144
152
  post_install_message:
145
153
  rdoc_options:
146
154
  - --line-numbers
@@ -166,9 +174,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
174
  requirements: []
167
175
 
168
176
  rubyforge_project: resourceful
169
- rubygems_version: 1.3.1
177
+ rubygems_version: 1.3.3
170
178
  signing_key:
171
- specification_version: 2
179
+ specification_version: 3
172
180
  summary: An HTTP library for Ruby that takes advantage of everything HTTP has to offer.
173
181
  test_files: []
174
182
 
@@ -1,249 +0,0 @@
1
- require 'pathname'
2
- require Pathname(__FILE__).dirname + '../spec_helper'
3
-
4
- require 'resourceful/authentication_manager'
5
-
6
- describe Resourceful::AuthenticationManager do
7
-
8
- before do
9
- @authmgr = Resourceful::AuthenticationManager.new
10
-
11
- @authenticator = mock('Authenticator')
12
- end
13
-
14
- [:add_auth_handler, :associate_auth_info, :add_credentials].each do |meth|
15
- it "should have ##{meth}" do
16
- @authmgr.should respond_to(meth)
17
- end
18
- end
19
-
20
- it 'should add an authenticator to its list' do
21
- @authmgr.add_auth_handler(@authenticator)
22
- @authmgr.instance_variable_get("@authenticators").should include(@authenticator)
23
- end
24
-
25
- describe 'associating authenticators with challanges' do
26
- before do
27
- @authmgr.add_auth_handler(@authenticator)
28
- @authenticator.stub!(:valid_for?).and_return(true)
29
- @authenticator.stub!(:update_credentials)
30
- @challenge = mock('Response')
31
- end
32
-
33
- it 'should check that an authenticator is valid for a challenge' do
34
- @authenticator.should_receive(:valid_for?).with(@challenge).and_return(true)
35
- @authmgr.associate_auth_info(@challenge)
36
- end
37
-
38
- it 'should update the credentials of the authenticator if it is valid for the challenge' do
39
- @authenticator.should_receive(:update_credentials).with(@challenge)
40
- @authmgr.associate_auth_info(@challenge)
41
- end
42
-
43
- it 'should not update the credentials of the authenticator if it is not valid for the challenge' do
44
- @authenticator.stub!(:valid_for?).and_return(false)
45
- @authenticator.should_not_receive(:update_credentials).with(@challenge)
46
- @authmgr.associate_auth_info(@challenge)
47
- end
48
-
49
- end
50
-
51
- describe 'adding credentials to a request' do
52
- before do
53
- @authmgr.add_auth_handler(@authenticator)
54
- @authenticator.stub!(:can_handle?).and_return(true)
55
- @authenticator.stub!(:add_credentials_to)
56
- @request = mock('Request')
57
- end
58
-
59
- it 'should find an authenticator that can handle the request' do
60
- @authenticator.should_receive(:can_handle?).with(@request).and_return(true)
61
- @authmgr.add_credentials(@request)
62
- end
63
-
64
- it 'should add the authenticators credentials to the request' do
65
- @authenticator.should_receive(:add_credentials_to).with(@request)
66
- @authmgr.add_credentials(@request)
67
- end
68
-
69
- it 'should not add the authenticators credentials to the request if it cant handle it' do
70
- @authenticator.should_receive(:can_handle?).with(@request).and_return(false)
71
- @authenticator.should_not_receive(:add_credentials_to).with(@request)
72
- @authmgr.add_credentials(@request)
73
- end
74
-
75
- end
76
-
77
- end
78
-
79
- describe Resourceful::BasicAuthenticator do
80
- before do
81
- @auth = Resourceful::BasicAuthenticator.new('Test Auth', 'admin', 'secret')
82
- end
83
-
84
- {:realm => 'Test Auth', :username => 'admin', :password => 'secret'}.each do |meth,val|
85
- it "should initialize with a #{meth}" do
86
- @auth.instance_variable_get("@#{meth}").should == val
87
- end
88
- end
89
-
90
- describe "Updating from a challenge response" do
91
- before do
92
- @header = {'WWW-Authenticate' => ['Basic realm="Test Auth"']}
93
- @chal = mock('response', :header => @header, :uri => 'http://example.com/foo/bar')
94
- end
95
-
96
- it 'should be valid for a challenge response with scheme "Basic" and the same realm' do
97
- @auth.valid_for?(@chal).should be_true
98
- end
99
-
100
- it 'should be valid for a challenge response with multiple schemes including matchin "Basic" challenge' do
101
- @header = {'WWW-Authenticate' => ['Digest some other stuff', 'Basic realm="Test Auth"', 'Weird scheme']}
102
-
103
- @auth.valid_for?(@chal).should be_true
104
- end
105
-
106
- it 'should not be sensitive to case variances in the scheme' do
107
- @header['WWW-Authenticate'] = ['bAsIc realm="Test Auth"']
108
- @auth.valid_for?(@chal).should be_true
109
- end
110
-
111
- it 'should not be sensitive to case variances in the realm directive' do
112
- @header['WWW-Authenticate'] = ['Basic rEaLm="Test Auth"']
113
- @auth.valid_for?(@chal).should be_true
114
- end
115
-
116
- it 'should not be sensitive to case variances in the realm value' do
117
- @header['WWW-Authenticate'] = ['Basic realm="test auth"']
118
- @auth.valid_for?(@chal).should be_true
119
- end
120
-
121
- it 'should not be valid if the scheme is not "Basic"' do
122
- @header['WWW-Authenticate'] = ["Digest"]
123
- @auth.valid_for?(@chal).should be_false
124
- end
125
-
126
- it 'should not be valid if the realm does not match' do
127
- @header['WWW-Authenticate'] = ['Basic realm="not test auth"']
128
- @auth.valid_for?(@chal).should be_false
129
- end
130
-
131
- it 'should not be valid if the header is unreadable' do
132
- @header['WWW-Authenticate'] = nil
133
- @auth.valid_for?(@chal).should be_false
134
- end
135
-
136
- it 'should set the valid domain from the host part of the challenge uri' do
137
- @auth.update_credentials(@chal)
138
- @auth.instance_variable_get("@domain").should == 'example.com'
139
- end
140
-
141
- end
142
-
143
- describe 'updating a request with credentials' do
144
- before do
145
- @auth.instance_variable_set("@domain", 'example.com')
146
- @header = {}
147
- @req = mock('request', :uri => 'http://example.com/bar/foo', :header => @header)
148
- end
149
-
150
- it 'should be able to handle a request for the matching domain' do
151
- @auth.can_handle?(@req).should be_true
152
- end
153
-
154
- it 'should add credentials to a request' do
155
- @header.should_receive(:[]=).with('Authorization', 'Basic YWRtaW46c2VjcmV0')
156
- @auth.add_credentials_to(@req)
157
- end
158
-
159
- it 'should build the credentials string for the header' do
160
- @auth.credentials.should == 'Basic YWRtaW46c2VjcmV0'
161
- end
162
- end
163
-
164
- end
165
-
166
- describe Resourceful::DigestAuthenticator do
167
-
168
- before do
169
- @header = {'WWW-Authenticate' => ['Digest realm="Test Auth"']}
170
- @chal = mock('response', :header => @header, :uri => 'http://example.com/foo/bar')
171
-
172
- @req_header = {}
173
- @req = mock('request', :header => @req_header,
174
- :uri => 'http://example.com',
175
- :method => 'GET')
176
-
177
- @auth = Resourceful::DigestAuthenticator.new('Test Auth', 'admin', 'secret')
178
- end
179
-
180
- {:realm => 'Test Auth', :username => 'admin', :password => 'secret'}.each do |meth,val|
181
- it "should initialize with a #{meth}" do
182
- @auth.instance_variable_get("@#{meth}").should == val
183
- end
184
- end
185
-
186
- describe "Updating credentials from a challenge response" do
187
-
188
- it "should set the domain from the host part of the challenge response uri" do
189
- @auth.update_credentials(@chal)
190
- @auth.domain.should == 'example.com'
191
- end
192
-
193
- it "should create an HTTPAuth Digest Challenge from the challenge response WWW-Authenticate header" do
194
- HTTPAuth::Digest::Challenge.should_receive(:from_header).with(@header['WWW-Authenticate'].first)
195
- @auth.update_credentials(@chal)
196
- end
197
-
198
- end
199
-
200
- describe "Validating a challenge" do
201
- it 'should be valid for a challenge response with scheme "Digest" and the same realm' do
202
- @auth.valid_for?(@chal).should be_true
203
- end
204
-
205
- it 'should not be valid if the scheme is not "Digest"' do
206
- @header['WWW-Authenticate'] = ["Basic"]
207
- @auth.valid_for?(@chal).should be_false
208
- end
209
-
210
- it 'should not be valid if the realm does not match' do
211
- @header['WWW-Authenticate'] = ['Digest realm="not test auth"']
212
- @auth.valid_for?(@chal).should be_false
213
- end
214
-
215
- it 'should not be valid if the header is unreadable' do
216
- @header['WWW-Authenticate'] = nil
217
- @auth.valid_for?(@chal).should be_false
218
- end
219
- end
220
-
221
- it "should be able to handle requests to the same domain" do
222
- @auth.instance_variable_set("@domain", 'example.com')
223
- @auth.can_handle?(@req).should be_true
224
- end
225
-
226
- it "should not handle requests to a different domain" do
227
- @auth.instance_variable_set("@domain", 'example2.com')
228
- @auth.can_handle?(@req).should be_false
229
- end
230
-
231
- it "should add credentials to a request" do
232
- @auth.update_credentials(@chal)
233
- @auth.add_credentials_to(@req)
234
- @req_header.should have_key('Authorization')
235
- @req_header['Authorization'].should_not be_blank
236
- end
237
-
238
- it "should have HTTPAuth::Digest generate the Authorization header" do
239
- @auth.update_credentials(@chal)
240
- cred = mock('digest_credentials', :to_header => nil)
241
-
242
- HTTPAuth::Digest::Credentials.should_receive(:from_challenge).with(
243
- @auth.challenge, :username => 'admin', :password => 'secret', :method => 'GET', :uri => ''
244
- ).and_return(cred)
245
-
246
- cred = @auth.credentials_for(@req)
247
- end
248
-
249
- end
@@ -1,223 +0,0 @@
1
- require 'pathname'
2
- require Pathname(__FILE__).dirname + '../spec_helper'
3
-
4
- require 'resourceful/cache_manager'
5
-
6
- describe Resourceful::AbstractCacheManager do
7
- before do
8
- @cm = Resourceful::InMemoryCacheManager.new #cheat, because I cant new a real one.
9
- end
10
-
11
- it 'should not be initializable' do
12
- lambda { Resourceful::CacheManager.new }.should raise_error
13
- end
14
-
15
- it 'should have a lookup method' do
16
- @cm.should respond_to(:lookup)
17
- end
18
-
19
- it 'should have a store method' do
20
- @cm.should respond_to(:store)
21
- end
22
-
23
- it 'should have a invalidate method' do
24
- @cm.should respond_to(:invalidate)
25
- end
26
- end
27
-
28
- describe Resourceful::NullCacheManager do
29
- before do
30
- @ncm = Resourceful::NullCacheManager.new
31
- end
32
-
33
- it 'should not find anything' do
34
- @ncm.lookup(:stuff).should be_nil
35
- end
36
-
37
- it 'should not store anything' do
38
- @ncm.should respond_to(:store)
39
-
40
- lambda { @ncm.store(:foo, :bar) }.should_not raise_error
41
- end
42
-
43
- end
44
-
45
- describe Resourceful::InMemoryCacheManager do
46
- before do
47
- @request = mock('request', :resource => mock('resource'),
48
- :request_time => Time.utc(2008,5,22,15,00),
49
- :uri => 'uri')
50
- @response = mock('response', :header => {}, :cachable? => true)
51
-
52
- @entry = mock('cache entry', :response => @response, :valid_for? => true)
53
- Resourceful::CacheEntry.stub!(:new).and_return(@entry)
54
-
55
- @imcm = Resourceful::InMemoryCacheManager.new
56
- end
57
-
58
- describe 'finding' do
59
- before do
60
- @response.stub!(:authoritative=)
61
- @imcm.instance_variable_set("@collection", {'uri' => {@request => @response}})
62
- end
63
-
64
- it 'should lookup the response by request' do
65
- @imcm.lookup(@request).should == @response
66
- end
67
-
68
- it 'should set the response to non-authoritative' do
69
- @response.should_receive(:authoritative=).with(false)
70
- @imcm.lookup(@request)
71
- end
72
- end
73
-
74
- describe 'saving' do
75
- it 'should make a new cache entry' do
76
- Resourceful::CacheEntry.should_receive(:new).with(
77
- @request,
78
- @response
79
- )
80
-
81
- @imcm.store(@request, @response)
82
- end
83
-
84
- it 'should store the response entity by request' do
85
- @imcm.store(@request, @response)
86
- col = @imcm.instance_variable_get("@collection")
87
- col['uri'][@request].should == @response
88
- end
89
-
90
- it 'should check if the response is cachable' do
91
- @response.should_receive(:cachable?).and_return(true)
92
- @imcm.store(@request, @response)
93
- end
94
-
95
- it 'should not store an entry if the response is not cachable' do
96
- @response.should_receive(:cachable?).and_return(false)
97
- @imcm.store(@request, @response)
98
- col = @imcm.instance_variable_get("@collection")
99
- col['uri'][@request].should be_nil
100
- end
101
- end
102
-
103
- describe 'invalidating' do
104
- it 'should remove an entry from the cache by uri' do
105
- @imcm.store(@request, @response)
106
- @imcm.invalidate('uri')
107
- col = @imcm.instance_variable_get("@collection")
108
- col.should_not have_key('uri')
109
- end
110
- end
111
-
112
- end
113
-
114
- describe Resourceful::CacheEntryCollection do
115
- before do
116
- @request = mock('request', :uri => 'this', :request_time => Time.now, :header => {})
117
- @valid_resp = stub('valid_resp', :authoritative= => nil, :header => {})
118
-
119
- @entry_valid = mock('entry', :valid_for? => true, :response => @valid_resp)
120
- @entry_invalid = mock('entry', :valid_for? => false, :response => stub('invalid_resp'))
121
-
122
- @collection = Resourceful::CacheEntryCollection.new
123
- end
124
-
125
- it 'should find the right entry for a request' do
126
- @collection.instance_variable_set('@entries', [@entry_valid, @entry_invalid])
127
- @entry_valid.should_receive(:valid_for?).with(@request).and_return(true)
128
- @collection[@request].should == @valid_resp
129
- end
130
-
131
- it 'should be nil if no matching entry was found' do
132
- @collection.instance_variable_set('@entries', [@entry_invalid])
133
- @entry_invalid.should_receive(:valid_for?).with(@request).and_return(false)
134
- @collection[@request].should == nil
135
- end
136
-
137
- it 'should store an entry' do
138
- @collection[@request] = @valid_resp
139
- @collection.instance_variable_get("@entries").should have(1).items
140
- end
141
-
142
- it 'should replace an existing entry if the existing entry matches the request' do
143
- new_resp = stub('new_resp', :authoritative= => nil, :header => {})
144
-
145
- @collection[@request] = @valid_resp
146
- @collection[@request] = new_resp
147
-
148
- @collection.instance_variable_get("@entries").map{|it| it.response}.should include(new_resp)
149
- @collection.instance_variable_get("@entries").map{|it| it.response}.should_not include(@valid_resp)
150
- end
151
-
152
- end
153
-
154
- describe Resourceful::CacheEntry do
155
- before do
156
- @entry = Resourceful::CacheEntry.new(
157
- mock('original_request', :header => {'Accept' => 'text/plain'} ,
158
- :request_time => Time.utc(2008,5,16,0,0,0), :uri => 'http://foo.invalid'),
159
- mock('response', :header => {'Vary' => 'Accept'})
160
- )
161
-
162
- @request = mock('request', :uri => 'http://foo.invalid')
163
- end
164
-
165
- describe "#valid_for?(a_request)" do
166
- it "should true for request to URI w/ matching header " do
167
- @entry.valid_for?(mock("new_request",
168
- :uri => 'http://foo.invalid',
169
- :header => {'Accept' => 'text/plain'})).should be_true
170
- end
171
-
172
- it "should false for requests against different URIs even if headers match" do
173
- @entry.valid_for?(mock("new_request", :uri => 'http://bar.invalid',
174
- :header => {'Accept' => 'text/plain'})).should be_false
175
- end
176
-
177
- it "should false for requests where headers don't match" do
178
- @entry.valid_for?(mock("new_request", :uri => 'http://foo.invalid',
179
- :header => {'Accept' => 'application/octet-stream'})).should be_false
180
- end
181
-
182
- it "should be false if request has a varying header and the original request was missing that header" do
183
- entry = Resourceful::CacheEntry.new(
184
- mock('original_request', :header => {},
185
- :request_time => Time.utc(2008,5,16,0,0,0), :uri => 'http://foo.invalid'),
186
- mock('response', :header => {'Vary' => 'Accept'}))
187
-
188
- entry.valid_for?(mock("new_request", :uri => 'http://foo.invalid',
189
- :header => {'Accept' => 'text/plain'})).should be_false
190
- end
191
- end
192
-
193
- describe '#select_request_headers' do
194
- before do
195
- @req_header = mock('header', :[] => nil)
196
- @request = mock('request', :header => @req_header)
197
-
198
- @resp_header = mock('header', :[] => nil)
199
- @response = mock('response', :header => @resp_header)
200
- end
201
-
202
- it 'should select the request headers from the Vary header' do
203
- @resp_header.should_receive(:[]).with('Vary')
204
- @entry.select_request_headers(@request, @response)
205
- end
206
-
207
- it 'should pull the values from the request that match keys in the vary header' do
208
- @resp_header.should_receive(:[]).with('Vary').twice.and_return(['foo', 'bar'])
209
- @req_header.should_receive(:[]).with('foo').and_return('oof')
210
- @req_header.should_receive(:[]).with('bar').and_return('rab')
211
-
212
- header = @entry.select_request_headers(@request, @response)
213
- header['foo'].should == 'oof'
214
- header['bar'].should == 'rab'
215
- end
216
-
217
- it 'should return a new Header object' do
218
- @entry.select_request_headers(@request, @response).should be_kind_of(Resourceful::Header)
219
- end
220
- end
221
- end
222
-
223
-