sinatra-contrib 2.0.0.rc1 → 2.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +2 -1
  3. data/lib/sinatra/decompile.rb +5 -0
  4. data/lib/sinatra/runner.rb +155 -0
  5. data/lib/sinatra/webdav.rb +93 -0
  6. data/sinatra-contrib.gemspec +5 -199
  7. metadata +13 -175
  8. data/spec/capture_spec.rb +0 -100
  9. data/spec/config_file/key_value.yml +0 -7
  10. data/spec/config_file/key_value.yml.erb +0 -6
  11. data/spec/config_file/key_value_override.yml +0 -2
  12. data/spec/config_file/missing_env.yml +0 -4
  13. data/spec/config_file/with_envs.yml +0 -7
  14. data/spec/config_file/with_nested_envs.yml +0 -11
  15. data/spec/config_file_spec.rb +0 -76
  16. data/spec/content_for/different_key.erb +0 -1
  17. data/spec/content_for/different_key.erubis +0 -1
  18. data/spec/content_for/different_key.haml +0 -2
  19. data/spec/content_for/different_key.slim +0 -2
  20. data/spec/content_for/footer.erb +0 -3
  21. data/spec/content_for/footer.erubis +0 -3
  22. data/spec/content_for/footer.haml +0 -2
  23. data/spec/content_for/footer.slim +0 -2
  24. data/spec/content_for/layout.erb +0 -1
  25. data/spec/content_for/layout.erubis +0 -1
  26. data/spec/content_for/layout.haml +0 -1
  27. data/spec/content_for/layout.slim +0 -1
  28. data/spec/content_for/multiple_blocks.erb +0 -4
  29. data/spec/content_for/multiple_blocks.erubis +0 -4
  30. data/spec/content_for/multiple_blocks.haml +0 -8
  31. data/spec/content_for/multiple_blocks.slim +0 -8
  32. data/spec/content_for/multiple_yields.erb +0 -3
  33. data/spec/content_for/multiple_yields.erubis +0 -3
  34. data/spec/content_for/multiple_yields.haml +0 -3
  35. data/spec/content_for/multiple_yields.slim +0 -3
  36. data/spec/content_for/passes_values.erb +0 -1
  37. data/spec/content_for/passes_values.erubis +0 -1
  38. data/spec/content_for/passes_values.haml +0 -1
  39. data/spec/content_for/passes_values.slim +0 -1
  40. data/spec/content_for/same_key.erb +0 -1
  41. data/spec/content_for/same_key.erubis +0 -1
  42. data/spec/content_for/same_key.haml +0 -2
  43. data/spec/content_for/same_key.slim +0 -2
  44. data/spec/content_for/takes_values.erb +0 -1
  45. data/spec/content_for/takes_values.erubis +0 -1
  46. data/spec/content_for/takes_values.haml +0 -3
  47. data/spec/content_for/takes_values.slim +0 -3
  48. data/spec/content_for_spec.rb +0 -241
  49. data/spec/cookies_spec.rb +0 -826
  50. data/spec/custom_logger_spec.rb +0 -43
  51. data/spec/extension_spec.rb +0 -32
  52. data/spec/json_spec.rb +0 -115
  53. data/spec/link_header_spec.rb +0 -99
  54. data/spec/multi_route_spec.rb +0 -59
  55. data/spec/namespace/foo.erb +0 -1
  56. data/spec/namespace/nested/foo.erb +0 -1
  57. data/spec/namespace_spec.rb +0 -791
  58. data/spec/okjson.rb +0 -581
  59. data/spec/reloader/app.rb.erb +0 -40
  60. data/spec/reloader_spec.rb +0 -465
  61. data/spec/required_params_spec.rb +0 -68
  62. data/spec/respond_with/bar.erb +0 -1
  63. data/spec/respond_with/bar.json.erb +0 -1
  64. data/spec/respond_with/baz.yajl +0 -1
  65. data/spec/respond_with/foo.html.erb +0 -1
  66. data/spec/respond_with/not_html.sass +0 -2
  67. data/spec/respond_with_spec.rb +0 -317
  68. data/spec/spec_helper.rb +0 -7
  69. data/spec/streaming_spec.rb +0 -415
@@ -1 +0,0 @@
1
- <% content_for :bar do %>bar<% end %>
@@ -1 +0,0 @@
1
- <% content_for :bar do %>bar<% end %>
@@ -1,2 +0,0 @@
1
- - content_for :bar do
2
- bar
@@ -1,2 +0,0 @@
1
- - content_for :bar do
2
- | bar
@@ -1,3 +0,0 @@
1
- <% if content_for? :foo %>
2
- <%= yield_content :foo %>
3
- <% end %>
@@ -1,3 +0,0 @@
1
- <% if content_for? :foo %>
2
- <%= yield_content :foo %>
3
- <% end %>
@@ -1,2 +0,0 @@
1
- - if content_for? :foo
2
- = yield_content :foo
@@ -1,2 +0,0 @@
1
- - if content_for? :foo
2
- = yield_content :foo
@@ -1 +0,0 @@
1
- <%= yield_content :foo %>
@@ -1 +0,0 @@
1
- <%= yield_content :foo %>
@@ -1 +0,0 @@
1
- = yield_content :foo
@@ -1 +0,0 @@
1
- = yield_content :foo
@@ -1,4 +0,0 @@
1
- <% content_for :foo do %>foo<% end %>
2
- <% content_for :foo do %>bar<% end %>
3
- <% content_for :baz do %>WON'T RENDER ME<% end %>
4
- <% content_for :foo do %>baz<% end %>
@@ -1,4 +0,0 @@
1
- <% content_for :foo do %>foo<% end %>
2
- <% content_for :foo do %>bar<% end %>
3
- <% content_for :baz do %>WON'T RENDER ME<% end %>
4
- <% content_for :foo do %>baz<% end %>
@@ -1,8 +0,0 @@
1
- - content_for :foo do
2
- foo
3
- - content_for :foo do
4
- bar
5
- - content_for :baz do
6
- WON'T RENDER ME
7
- - content_for :foo do
8
- baz
@@ -1,8 +0,0 @@
1
- - content_for :foo do
2
- | foo
3
- - content_for :foo do
4
- | bar
5
- - content_for :baz do
6
- | WON'T RENDER ME
7
- - content_for :foo do
8
- | baz
@@ -1,3 +0,0 @@
1
- <%= yield_content :foo %>
2
- <%= yield_content :foo %>
3
- <%= yield_content :foo %>
@@ -1,3 +0,0 @@
1
- <%= yield_content :foo %>
2
- <%= yield_content :foo %>
3
- <%= yield_content :foo %>
@@ -1,3 +0,0 @@
1
- = yield_content :foo
2
- = yield_content :foo
3
- = yield_content :foo
@@ -1,3 +0,0 @@
1
- = yield_content :foo
2
- = yield_content :foo
3
- = yield_content :foo
@@ -1 +0,0 @@
1
- <%= yield_content :foo, 1, 2 %>
@@ -1 +0,0 @@
1
- <%= yield_content :foo, 1, 2 %>
@@ -1 +0,0 @@
1
- = yield_content :foo, 1, 2
@@ -1 +0,0 @@
1
- == yield_content :foo, 1, 2
@@ -1 +0,0 @@
1
- <% content_for :foo do %>foo<% end %>
@@ -1 +0,0 @@
1
- <% content_for :foo do %>foo<% end %>
@@ -1,2 +0,0 @@
1
- - content_for :foo do
2
- foo
@@ -1,2 +0,0 @@
1
- - content_for :foo do
2
- | foo
@@ -1 +0,0 @@
1
- <% content_for :foo do |a, b| %><i><%= a %></i> <%= b %><% end %>
@@ -1 +0,0 @@
1
- <% content_for :foo do |a, b| %><i><%= a %></i> <%= b %><% end %>
@@ -1,3 +0,0 @@
1
- - content_for :foo do |a, b|
2
- %i= a
3
- =b
@@ -1,3 +0,0 @@
1
- - content_for :foo do |a, b|
2
- i= a
3
- = b
@@ -1,241 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Sinatra::ContentFor do
4
- subject do
5
- Sinatra.new do
6
- helpers Sinatra::ContentFor
7
- set :views, File.expand_path("../content_for", __FILE__)
8
- end.new!
9
- end
10
-
11
- Tilt.prefer Tilt::ERBTemplate
12
-
13
- extend Forwardable
14
- def_delegators :subject, :content_for, :clear_content_for, :yield_content
15
- def render(engine, template)
16
- subject.send(:render, engine, template, :layout => false).gsub(/\s/, '')
17
- end
18
-
19
- describe "without templates" do
20
- it 'renders blocks declared with the same key you use when rendering' do
21
- content_for(:foo) { "foo" }
22
- expect(yield_content(:foo)).to eq("foo")
23
- end
24
-
25
- it 'renders blocks more than once' do
26
- content_for(:foo) { "foo" }
27
- 3.times { expect(yield_content(:foo)).to eq("foo") }
28
- end
29
-
30
- it 'does not render a block with a different key' do
31
- content_for(:bar) { "bar" }
32
- expect(yield_content(:foo)).to be_empty
33
- end
34
-
35
- it 'renders default content if no block matches the key and a default block is specified' do
36
- content_for(:bar) { "bar" }
37
- expect(yield_content(:foo) { "foo" }).to eq("foo")
38
- end
39
-
40
- it 'renders multiple blocks with the same key' do
41
- content_for(:foo) { "foo" }
42
- content_for(:foo) { "bar" }
43
- content_for(:bar) { "WON'T RENDER ME" }
44
- content_for(:foo) { "baz" }
45
- expect(yield_content(:foo)).to eq("foobarbaz")
46
- end
47
-
48
- it 'renders multiple blocks more than once' do
49
- content_for(:foo) { "foo" }
50
- content_for(:foo) { "bar" }
51
- content_for(:bar) { "WON'T RENDER ME" }
52
- content_for(:foo) { "baz" }
53
- 3.times { expect(yield_content(:foo)).to eq("foobarbaz") }
54
- end
55
-
56
- it 'passes values to the blocks' do
57
- content_for(:foo) { |a| a.upcase }
58
- expect(yield_content(:foo, 'a')).to eq("A")
59
- expect(yield_content(:foo, 'b')).to eq("B")
60
- end
61
-
62
- it 'clears named blocks with the specified key' do
63
- content_for(:foo) { "foo" }
64
- expect(yield_content(:foo)).to eq("foo")
65
- clear_content_for(:foo)
66
- expect(yield_content(:foo)).to be_empty
67
- end
68
-
69
- it 'takes an immediate value instead of a block' do
70
- content_for(:foo, "foo")
71
- expect(yield_content(:foo)).to eq("foo")
72
- end
73
- end
74
-
75
- # TODO: liquid radius markaby builder nokogiri
76
- engines = %w[erb erubis haml slim]
77
-
78
- engines.each do |inner|
79
- describe inner.capitalize do
80
- before :all do
81
- begin
82
- require inner
83
- rescue LoadError => e
84
- skip "Skipping: " << e.message
85
- end
86
- end
87
-
88
- describe "with yield_content in Ruby" do
89
- it 'renders blocks declared with the same key you use when rendering' do
90
- render inner, :same_key
91
- expect(yield_content(:foo).strip).to eq("foo")
92
- end
93
-
94
- it 'renders blocks more than once' do
95
- render inner, :same_key
96
- 3.times { expect(yield_content(:foo).strip).to eq("foo") }
97
- end
98
-
99
- it 'does not render a block with a different key' do
100
- render inner, :different_key
101
- expect(yield_content(:foo)).to be_empty
102
- end
103
-
104
- it 'renders default content if no block matches the key and a default block is specified' do
105
- render inner, :different_key
106
- expect(yield_content(:foo) { "foo" }).to eq("foo")
107
- end
108
-
109
- it 'renders multiple blocks with the same key' do
110
- render inner, :multiple_blocks
111
- expect(yield_content(:foo).gsub(/\s/, '')).to eq("foobarbaz")
112
- end
113
-
114
- it 'renders multiple blocks more than once' do
115
- render inner, :multiple_blocks
116
- 3.times { expect(yield_content(:foo).gsub(/\s/, '')).to eq("foobarbaz") }
117
- end
118
-
119
- it 'passes values to the blocks' do
120
- render inner, :takes_values
121
- expect(yield_content(:foo, 1, 2).gsub(/\s/, '')).to eq("<i>1</i>2")
122
- end
123
- end
124
-
125
- describe "with content_for in Ruby" do
126
- it 'renders blocks declared with the same key you use when rendering' do
127
- content_for(:foo) { "foo" }
128
- expect(render(inner, :layout)).to eq("foo")
129
- end
130
-
131
- it 'renders blocks more than once' do
132
- content_for(:foo) { "foo" }
133
- expect(render(inner, :multiple_yields)).to eq("foofoofoo")
134
- end
135
-
136
- it 'does not render a block with a different key' do
137
- content_for(:bar) { "foo" }
138
- expect(render(inner, :layout)).to be_empty
139
- end
140
-
141
- it 'renders multiple blocks with the same key' do
142
- content_for(:foo) { "foo" }
143
- content_for(:foo) { "bar" }
144
- content_for(:bar) { "WON'T RENDER ME" }
145
- content_for(:foo) { "baz" }
146
- expect(render(inner, :layout)).to eq("foobarbaz")
147
- end
148
-
149
- it 'renders multiple blocks more than once' do
150
- content_for(:foo) { "foo" }
151
- content_for(:foo) { "bar" }
152
- content_for(:bar) { "WON'T RENDER ME" }
153
- content_for(:foo) { "baz" }
154
- expect(render(inner, :multiple_yields)).to eq("foobarbazfoobarbazfoobarbaz")
155
- end
156
-
157
- it 'passes values to the blocks' do
158
- content_for(:foo) { |a,b| "<i>#{a}</i>#{b}" }
159
- expect(render(inner, :passes_values)).to eq("<i>1</i>2")
160
- end
161
-
162
- it 'clears named blocks with the specified key' do
163
- content_for(:foo) { "foo" }
164
- expect(render(inner, :layout)).to eq("foo")
165
- clear_content_for(:foo)
166
- expect(render(inner, :layout)).to be_empty
167
- end
168
- end
169
-
170
- describe "with content_for? in Ruby" do
171
- it 'renders block if key is set' do
172
- content_for(:foo) { "foot" }
173
- expect(render(inner, :footer)).to eq("foot")
174
- end
175
-
176
- it 'does not render a block if different key' do
177
- content_for(:different_key) { "foot" }
178
- expect(render(inner, :footer)).to be_empty
179
- end
180
- end
181
-
182
- engines.each do |outer|
183
- describe "with yield_content in #{outer.capitalize}" do
184
- def body
185
- last_response.body.gsub(/\s/, '')
186
- end
187
-
188
- before :all do
189
- begin
190
- require outer
191
- rescue LoadError => e
192
- skip "Skipping: " << e.message
193
- end
194
- end
195
-
196
- before do
197
- mock_app do
198
- helpers Sinatra::ContentFor
199
- set inner, :layout_engine => outer
200
- set :views, File.expand_path("../content_for", __FILE__)
201
- get('/:view') { render(inner, params[:view].to_sym) }
202
- get('/:layout/:view') do
203
- render inner, params[:view].to_sym, :layout => params[:layout].to_sym
204
- end
205
- end
206
- end
207
-
208
- it 'renders blocks declared with the same key you use when rendering' do
209
- expect(get('/same_key')).to be_ok
210
- expect(body).to eq("foo")
211
- end
212
-
213
- it 'renders blocks more than once' do
214
- expect(get('/multiple_yields/same_key')).to be_ok
215
- expect(body).to eq("foofoofoo")
216
- end
217
-
218
- it 'does not render a block with a different key' do
219
- expect(get('/different_key')).to be_ok
220
- expect(body).to be_empty
221
- end
222
-
223
- it 'renders multiple blocks with the same key' do
224
- expect(get('/multiple_blocks')).to be_ok
225
- expect(body).to eq("foobarbaz")
226
- end
227
-
228
- it 'renders multiple blocks more than once' do
229
- expect(get('/multiple_yields/multiple_blocks')).to be_ok
230
- expect(body).to eq("foobarbazfoobarbazfoobarbaz")
231
- end
232
-
233
- it 'passes values to the blocks' do
234
- expect(get('/passes_values/takes_values')).to be_ok
235
- expect(body).to eq("<i>1</i>2")
236
- end
237
- end
238
- end
239
- end
240
- end
241
- end
@@ -1,826 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Sinatra::Cookies do
4
- def cookie_route(*cookies, &block)
5
- result = nil
6
- set_cookie(cookies)
7
- @cookie_app.get('/') do
8
- result = instance_eval(&block)
9
- "ok"
10
- end
11
- get '/', {}, @headers || {}
12
- expect(last_response).to be_ok
13
- expect(body).to eq("ok")
14
- result
15
- end
16
-
17
- def cookies(*set_cookies)
18
- cookie_route(*set_cookies) { cookies }
19
- end
20
-
21
- before do
22
- app = nil
23
- mock_app do
24
- helpers Sinatra::Cookies
25
- app = self
26
- end
27
- @cookie_app = app
28
- clear_cookies
29
- end
30
-
31
- describe :cookie_route do
32
- it 'runs the block' do
33
- ran = false
34
- cookie_route { ran = true }
35
- expect(ran).to be true
36
- end
37
-
38
- it 'returns the block result' do
39
- expect(cookie_route { 42 }).to eq(42)
40
- end
41
- end
42
-
43
- describe :== do
44
- it 'is comparable to hashes' do
45
- expect(cookies).to eq({})
46
- end
47
-
48
- it 'is comparable to anything that responds to to_hash' do
49
- other = Struct.new(:to_hash).new({})
50
- expect(cookies).to eq(other)
51
- end
52
- end
53
-
54
- describe :[] do
55
- it 'allows access to request cookies' do
56
- expect(cookies("foo=bar")["foo"]).to eq("bar")
57
- end
58
-
59
- it 'takes symbols as keys' do
60
- expect(cookies("foo=bar")[:foo]).to eq("bar")
61
- end
62
-
63
- it 'returns nil for missing keys' do
64
- expect(cookies("foo=bar")['bar']).to be_nil
65
- end
66
-
67
- it 'allows access to response cookies' do
68
- expect(cookie_route do
69
- response.set_cookie 'foo', 'bar'
70
- cookies['foo']
71
- end).to eq('bar')
72
- end
73
-
74
- it 'favors response cookies over request cookies' do
75
- expect(cookie_route('foo=bar') do
76
- response.set_cookie 'foo', 'baz'
77
- cookies['foo']
78
- end).to eq('baz')
79
- end
80
-
81
-
82
- it 'takes the last value for response cookies' do
83
- expect(cookie_route do
84
- response.set_cookie 'foo', 'bar'
85
- response.set_cookie 'foo', 'baz'
86
- cookies['foo']
87
- end).to eq('baz')
88
- end
89
- end
90
-
91
- describe :[]= do
92
- it 'sets cookies to httponly' do
93
- expect(cookie_route do
94
- cookies['foo'] = 'bar'
95
- response['Set-Cookie'].lines.detect { |l| l.start_with? 'foo=' }
96
- end).to include('HttpOnly')
97
- end
98
-
99
- it 'sets domain to nil if localhost' do
100
- @headers = {'HTTP_HOST' => 'localhost'}
101
- expect(cookie_route do
102
- cookies['foo'] = 'bar'
103
- response['Set-Cookie']
104
- end).not_to include("domain")
105
- end
106
-
107
- it 'sets the domain' do
108
- expect(cookie_route do
109
- cookies['foo'] = 'bar'
110
- response['Set-Cookie'].lines.detect { |l| l.start_with? 'foo=' }
111
- end).to include('domain=example.org')
112
- end
113
-
114
- it 'sets path to / by default' do
115
- expect(cookie_route do
116
- cookies['foo'] = 'bar'
117
- response['Set-Cookie'].lines.detect { |l| l.start_with? 'foo=' }
118
- end).to include('path=/')
119
- end
120
-
121
- it 'sets path to the script_name if app is nested' do
122
- expect(cookie_route do
123
- request.script_name = '/foo'
124
- cookies['foo'] = 'bar'
125
- response['Set-Cookie'].lines.detect { |l| l.start_with? 'foo=' }
126
- end).to include('path=/foo')
127
- end
128
-
129
- it 'sets a cookie' do
130
- cookie_route { cookies['foo'] = 'bar' }
131
- expect(cookie_jar['foo']).to eq('bar')
132
- end
133
-
134
- it 'adds a value to the cookies hash' do
135
- expect(cookie_route do
136
- cookies['foo'] = 'bar'
137
- cookies['foo']
138
- end).to eq('bar')
139
- end
140
- end
141
-
142
- describe :assoc do
143
- it 'behaves like Hash#assoc' do
144
- cookies('foo=bar').assoc('foo') == ['foo', 'bar']
145
- end
146
- end if Hash.method_defined? :assoc
147
-
148
- describe :clear do
149
- it 'removes request cookies from cookies hash' do
150
- jar = cookies('foo=bar')
151
- expect(jar['foo']).to eq('bar')
152
- jar.clear
153
- expect(jar['foo']).to be_nil
154
- end
155
-
156
- it 'removes response cookies from cookies hash' do
157
- expect(cookie_route do
158
- cookies['foo'] = 'bar'
159
- cookies.clear
160
- cookies['foo']
161
- end).to be_nil
162
- end
163
-
164
- it 'expires existing cookies' do
165
- expect(cookie_route("foo=bar") do
166
- cookies.clear
167
- response['Set-Cookie']
168
- end).to include("foo=;", "expires=", "1970 00:00:00")
169
- end
170
- end
171
-
172
- describe :compare_by_identity? do
173
- it { expect(cookies).not_to be_compare_by_identity }
174
- end
175
-
176
- describe :default do
177
- it { expect(cookies.default).to be_nil }
178
- end
179
-
180
- describe :default_proc do
181
- it { expect(cookies.default_proc).to be_nil }
182
- end
183
-
184
- describe :delete do
185
- it 'removes request cookies from cookies hash' do
186
- jar = cookies('foo=bar')
187
- expect(jar['foo']).to eq('bar')
188
- jar.delete 'foo'
189
- expect(jar['foo']).to be_nil
190
- end
191
-
192
- it 'removes response cookies from cookies hash' do
193
- expect(cookie_route do
194
- cookies['foo'] = 'bar'
195
- cookies.delete 'foo'
196
- cookies['foo']
197
- end).to be_nil
198
- end
199
-
200
- it 'expires existing cookies' do
201
- expect(cookie_route("foo=bar") do
202
- cookies.delete 'foo'
203
- response['Set-Cookie']
204
- end).to include("foo=;", "expires=", "1970 00:00:00")
205
- end
206
-
207
- it 'honours the app cookie_options' do
208
- @cookie_app.class_eval do
209
- set :cookie_options, {
210
- :path => '/foo',
211
- :domain => 'bar.com',
212
- :secure => true,
213
- :httponly => true
214
- }
215
- end
216
- cookie_header = cookie_route("foo=bar") do
217
- cookies.delete 'foo'
218
- response['Set-Cookie']
219
- end
220
- expect(cookie_header).to include("path=/foo;", "domain=bar.com;", "secure;", "HttpOnly")
221
- end
222
-
223
- it 'does not touch other cookies' do
224
- expect(cookie_route("foo=bar", "bar=baz") do
225
- cookies.delete 'foo'
226
- cookies['bar']
227
- end).to eq('baz')
228
- end
229
-
230
- it 'returns the previous value for request cookies' do
231
- expect(cookie_route("foo=bar") do
232
- cookies.delete "foo"
233
- end).to eq("bar")
234
- end
235
-
236
- it 'returns the previous value for response cookies' do
237
- expect(cookie_route do
238
- cookies['foo'] = 'bar'
239
- cookies.delete "foo"
240
- end).to eq("bar")
241
- end
242
-
243
- it 'returns nil for non-existing cookies' do
244
- expect(cookie_route { cookies.delete("foo") }).to be_nil
245
- end
246
- end
247
-
248
- describe :delete_if do
249
- it 'deletes cookies that match the block' do
250
- expect(cookie_route('foo=bar') do
251
- cookies['bar'] = 'baz'
252
- cookies['baz'] = 'foo'
253
- cookies.delete_if { |*a| a.include? 'bar' }
254
- cookies.values_at 'foo', 'bar', 'baz'
255
- end).to eq([nil, nil, 'foo'])
256
- end
257
- end
258
-
259
- describe :each do
260
- it 'loops through cookies' do
261
- keys = []
262
- foo = nil
263
- bar = nil
264
-
265
- cookie_route('foo=bar', 'bar=baz') do
266
- cookies.each do |key, value|
267
- foo = value if key == 'foo'
268
- bar = value if key == 'bar'
269
- keys << key
270
- end
271
- end
272
-
273
- expect(keys.sort).to eq(['bar', 'foo'])
274
- expect(foo).to eq('bar')
275
- expect(bar).to eq('baz')
276
- end
277
-
278
- it 'favors response over request cookies' do
279
- seen = false
280
- key = nil
281
- value = nil
282
- cookie_route('foo=bar') do
283
- cookies[:foo] = 'baz'
284
- cookies.each do |k,v|
285
- key = k
286
- value = v
287
- end
288
- end
289
- expect(key).to eq('foo')
290
- expect(value).to eq('baz')
291
- expect(seen).to eq(false)
292
- end
293
-
294
- it 'does not loop through deleted cookies' do
295
- cookie_route('foo=bar') do
296
- cookies.delete :foo
297
- cookies.each { fail }
298
- end
299
- end
300
-
301
- it 'returns an enumerator' do
302
- keys = []
303
- cookie_route('foo=bar') do
304
- enum = cookies.each
305
- enum.each { |key, value| keys << key }
306
- end
307
- keys.each{ |key| expect(key).to eq('foo')}
308
- end
309
- end
310
-
311
- describe :each_key do
312
- it 'loops through cookies' do
313
- keys = []
314
-
315
- cookie_route('foo=bar', 'bar=baz') do
316
- cookies.each_key do |key|
317
- keys << key
318
- end
319
- end
320
-
321
- expect(keys.sort).to eq(['bar', 'foo'])
322
- end
323
-
324
- it 'only yields keys once' do
325
- seen = false
326
- cookie_route('foo=bar') do
327
- cookies[:foo] = 'baz'
328
- end
329
- expect(seen).to eq(false)
330
- end
331
-
332
- it 'does not loop through deleted cookies' do
333
- cookie_route('foo=bar') do
334
- cookies.delete :foo
335
- cookies.each_key { fail }
336
- end
337
- end
338
-
339
- it 'returns an enumerator' do
340
- keys = []
341
- cookie_route('foo=bar') do
342
- enum = cookies.each_key
343
- enum.each { |key| keys << key }
344
- end
345
- keys.each{ |key| expect(key).to eq('foo')}
346
- end
347
- end
348
-
349
- describe :each_pair do
350
- it 'loops through cookies' do
351
- keys = []
352
- foo = nil
353
- bar = nil
354
-
355
- cookie_route('foo=bar', 'bar=baz') do
356
- cookies.each_pair do |key, value|
357
- foo = value if key == 'foo'
358
- bar = value if key == 'bar'
359
- keys << key
360
- end
361
- end
362
-
363
- expect(keys.sort).to eq(['bar', 'foo'])
364
- expect(foo).to eq('bar')
365
- expect(bar).to eq('baz')
366
- end
367
-
368
- it 'favors response over request cookies' do
369
- seen = false
370
- key = nil
371
- value = nil
372
- cookie_route('foo=bar') do
373
- cookies[:foo] = 'baz'
374
- cookies.each_pair do |k, v|
375
- key = k
376
- value = v
377
- end
378
- end
379
- expect(key).to eq('foo')
380
- expect(value).to eq('baz')
381
- expect(seen).to eq(false)
382
- end
383
-
384
- it 'does not loop through deleted cookies' do
385
- cookie_route('foo=bar') do
386
- cookies.delete :foo
387
- cookies.each_pair { fail }
388
- end
389
- end
390
-
391
- it 'returns an enumerator' do
392
- keys = []
393
- cookie_route('foo=bar') do
394
- enum = cookies.each_pair
395
- enum.each { |key, value| keys << key }
396
- end
397
- keys.each{ |key| expect(key).to eq('foo')}
398
- end
399
- end
400
-
401
- describe :each_value do
402
- it 'loops through cookies' do
403
- values = []
404
-
405
- cookie_route('foo=bar', 'bar=baz') do
406
- cookies.each_value do |value|
407
- values << value
408
- end
409
- end
410
-
411
- expect(values.sort).to eq(['bar', 'baz'])
412
- end
413
-
414
- it 'favors response over request cookies' do
415
- seen = false
416
- value = nil
417
- cookie_route('foo=bar') do
418
- cookies[:foo] = 'baz'
419
- cookies.each_value do |v|
420
- value = v
421
- end
422
- end
423
- expect(value).to eq('baz')
424
- end
425
-
426
- it 'does not loop through deleted cookies' do
427
- cookie_route('foo=bar') do
428
- cookies.delete :foo
429
- cookies.each_value { fail }
430
- end
431
- end
432
-
433
- it 'returns an enumerator' do
434
- enum = nil
435
- cookie_route('foo=bar') do
436
- enum = cookies.each_value
437
- end
438
- enum.each { |value| expect(value).to eq('bar') }
439
- end
440
- end
441
-
442
- describe :empty? do
443
- it 'returns true if there are no cookies' do
444
- expect(cookies).to be_empty
445
- end
446
-
447
- it 'returns false if there are request cookies' do
448
- expect(cookies('foo=bar')).not_to be_empty
449
- end
450
-
451
- it 'returns false if there are response cookies' do
452
- expect(cookie_route do
453
- cookies['foo'] = 'bar'
454
- cookies.empty?
455
- end).to be false
456
- end
457
-
458
- it 'becomes true if response cookies are removed' do
459
- expect(cookie_route do
460
- cookies['foo'] = 'bar'
461
- cookies.delete :foo
462
- cookies.empty?
463
- end).to be true
464
- end
465
-
466
- it 'becomes true if request cookies are removed' do
467
- expect(cookie_route('foo=bar') do
468
- cookies.delete :foo
469
- cookies.empty?
470
- end).to be_truthy
471
- end
472
-
473
- it 'becomes true after clear' do
474
- expect(cookie_route('foo=bar', 'bar=baz') do
475
- cookies['foo'] = 'bar'
476
- cookies.clear
477
- cookies.empty?
478
- end).to be_truthy
479
- end
480
- end
481
-
482
- describe :fetch do
483
- it 'returns values from request cookies' do
484
- expect(cookies('foo=bar').fetch('foo')).to eq('bar')
485
- end
486
-
487
- it 'returns values from response cookies' do
488
- expect(cookie_route do
489
- cookies['foo'] = 'bar'
490
- cookies.fetch('foo')
491
- end).to eq('bar')
492
- end
493
-
494
- it 'favors response over request cookies' do
495
- expect(cookie_route('foo=baz') do
496
- cookies['foo'] = 'bar'
497
- cookies.fetch('foo')
498
- end).to eq('bar')
499
- end
500
-
501
- it 'raises an exception if key does not exist' do
502
- error = if defined? JRUBY_VERSION
503
- IndexError
504
- else
505
- KeyError
506
- end
507
- expect { cookies.fetch('foo') }.to raise_exception(error)
508
- end
509
-
510
- it 'returns the block result if missing' do
511
- expect(cookies.fetch('foo') { 'bar' }).to eq('bar')
512
- end
513
- end
514
-
515
- describe :flatten do
516
- it { expect(cookies('foo=bar').flatten).to eq({'foo' => 'bar'}.flatten) }
517
- end if Hash.method_defined? :flatten
518
-
519
- describe :has_key? do
520
- it 'checks request cookies' do
521
- expect(cookies('foo=bar')).to have_key('foo')
522
- end
523
-
524
- it 'checks response cookies' do
525
- jar = cookies
526
- jar['foo'] = 'bar'
527
- expect(jar).to have_key(:foo)
528
- end
529
-
530
- it 'does not use deleted cookies' do
531
- jar = cookies('foo=bar')
532
- jar.delete :foo
533
- expect(jar).not_to have_key('foo')
534
- end
535
- end
536
-
537
- describe :has_value? do
538
- it 'checks request cookies' do
539
- expect(cookies('foo=bar')).to have_value('bar')
540
- end
541
-
542
- it 'checks response cookies' do
543
- jar = cookies
544
- jar[:foo] = 'bar'
545
- expect(jar).to have_value('bar')
546
- end
547
-
548
- it 'does not use deleted cookies' do
549
- jar = cookies('foo=bar')
550
- jar.delete :foo
551
- expect(jar).not_to have_value('bar')
552
- end
553
- end
554
-
555
- describe :include? do
556
- it 'checks request cookies' do
557
- expect(cookies('foo=bar')).to include('foo')
558
- end
559
-
560
- it 'checks response cookies' do
561
- jar = cookies
562
- jar['foo'] = 'bar'
563
- expect(jar).to include(:foo)
564
- end
565
-
566
- it 'does not use deleted cookies' do
567
- jar = cookies('foo=bar')
568
- jar.delete :foo
569
- expect(jar).not_to include('foo')
570
- end
571
- end
572
-
573
- describe :keep_if do
574
- it 'removes entries' do
575
- jar = cookies('foo=bar', 'bar=baz')
576
- jar.keep_if { |*args| args == ['bar', 'baz'] }
577
- expect(jar).to eq({'bar' => 'baz'})
578
- end
579
- end
580
-
581
- describe :key do
582
- it 'checks request cookies' do
583
- expect(cookies('foo=bar').key('bar')).to eq('foo')
584
- end
585
-
586
- it 'checks response cookies' do
587
- jar = cookies
588
- jar['foo'] = 'bar'
589
- expect(jar.key('bar')).to eq('foo')
590
- end
591
-
592
- it 'returns nil when missing' do
593
- expect(cookies('foo=bar').key('baz')).to be_nil
594
- end
595
- end
596
-
597
- describe :key? do
598
- it 'checks request cookies' do
599
- expect(cookies('foo=bar').key?('foo')).to be true
600
- end
601
-
602
- it 'checks response cookies' do
603
- jar = cookies
604
- jar['foo'] = 'bar'
605
- expect(jar.key?(:foo)).to be true
606
- end
607
-
608
- it 'does not use deleted cookies' do
609
- jar = cookies('foo=bar')
610
- jar.delete :foo
611
- expect(jar.key?('foo')).to be false
612
- end
613
- end
614
-
615
- describe :keys do
616
- it { expect(cookies('foo=bar').keys).to eq(['foo']) }
617
- end
618
-
619
- describe :length do
620
- it { expect(cookies.length).to eq(0) }
621
- it { expect(cookies('foo=bar').length).to eq(1) }
622
- end
623
-
624
- describe :member? do
625
- it 'checks request cookies' do
626
- expect(cookies('foo=bar').member?('foo')).to be true
627
- end
628
-
629
- it 'checks response cookies' do
630
- jar = cookies
631
- jar['foo'] = 'bar'
632
- expect(jar.member?(:foo)).to be true
633
- end
634
-
635
- it 'does not use deleted cookies' do
636
- jar = cookies('foo=bar')
637
- jar.delete :foo
638
- expect(jar.member?('foo')).to be false
639
- end
640
- end
641
-
642
- describe :merge do
643
- it 'is mergable with a hash' do
644
- expect(cookies('foo=bar').merge(:bar => :baz)).to eq({"foo" => "bar", :bar => :baz})
645
- end
646
-
647
- it 'does not create cookies' do
648
- jar = cookies('foo=bar')
649
- jar.merge(:bar => 'baz')
650
- expect(jar).not_to include(:bar)
651
- end
652
-
653
- it 'takes a block for conflict resolution' do
654
- update = {'foo' => 'baz', 'bar' => 'baz'}
655
- merged = cookies('foo=bar').merge(update) do |key, old, other|
656
- expect(key).to eq('foo')
657
- expect(old).to eq('bar')
658
- expect(other).to eq('baz')
659
- 'foo'
660
- end
661
- expect(merged['foo']).to eq('foo')
662
- end
663
- end
664
-
665
- describe :merge! do
666
- it 'creates cookies' do
667
- jar = cookies('foo=bar')
668
- jar.merge! :bar => 'baz'
669
- expect(jar).to include('bar')
670
- end
671
-
672
- it 'overrides existing values' do
673
- jar = cookies('foo=bar')
674
- jar.merge! :foo => "baz"
675
- expect(jar["foo"]).to eq("baz")
676
- end
677
-
678
- it 'takes a block for conflict resolution' do
679
- update = {'foo' => 'baz', 'bar' => 'baz'}
680
- jar = cookies('foo=bar')
681
- jar.merge!(update) do |key, old, other|
682
- expect(key).to eq('foo')
683
- expect(old).to eq('bar')
684
- expect(other).to eq('baz')
685
- 'foo'
686
- end
687
- expect(jar['foo']).to eq('foo')
688
- end
689
- end
690
-
691
- describe :rassoc do
692
- it 'behaves like Hash#assoc' do
693
- cookies('foo=bar').rassoc('bar') == ['foo', 'bar']
694
- end
695
- end if Hash.method_defined? :rassoc
696
-
697
- describe :reject do
698
- it 'removes entries from new hash' do
699
- jar = cookies('foo=bar', 'bar=baz')
700
- sub = jar.reject { |*args| args == ['bar', 'baz'] }
701
- expect(sub).to eq({'foo' => 'bar'})
702
- expect(jar['bar']).to eq('baz')
703
- end
704
- end
705
-
706
- describe :reject! do
707
- it 'removes entries' do
708
- jar = cookies('foo=bar', 'bar=baz')
709
- jar.reject! { |*args| args == ['bar', 'baz'] }
710
- expect(jar).to eq({'foo' => 'bar'})
711
- end
712
- end
713
-
714
- describe :replace do
715
- it 'replaces entries' do
716
- jar = cookies('foo=bar', 'bar=baz')
717
- jar.replace 'foo' => 'baz', 'baz' => 'bar'
718
- expect(jar).to eq({'foo' => 'baz', 'baz' => 'bar'})
719
- end
720
- end
721
-
722
- describe :set do
723
- it 'sets a cookie' do
724
- cookie_route { cookies.set('foo', value: 'bar') }
725
- expect(cookie_jar['foo']).to eq('bar')
726
- end
727
-
728
- it 'sets a cookie with HttpOnly' do
729
- expect(cookie_route do
730
- request.script_name = '/foo'
731
- cookies.set('foo', value: 'bar', httponly: true)
732
- response['Set-Cookie'].lines.detect { |l| l.start_with? 'foo=' }
733
- end).to include('HttpOnly')
734
- end
735
-
736
- it 'sets a cookie without HttpOnly' do
737
- expect(cookie_route do
738
- request.script_name = '/foo'
739
- cookies.set('foo', value: 'bar', httponly: false)
740
- response['Set-Cookie'].lines.detect { |l| l.start_with? 'foo=' }
741
- end).not_to include('HttpOnly')
742
- end
743
- end
744
-
745
- describe :select do
746
- it 'removes entries from new hash' do
747
- jar = cookies('foo=bar', 'bar=baz')
748
- sub = jar.select { |*args| args != ['bar', 'baz'] }
749
- expect(sub).to eq({'foo' => 'bar'}.select { true })
750
- expect(jar['bar']).to eq('baz')
751
- end
752
- end
753
-
754
- describe :select! do
755
- it 'removes entries' do
756
- jar = cookies('foo=bar', 'bar=baz')
757
- jar.select! { |*args| args != ['bar', 'baz'] }
758
- expect(jar).to eq({'foo' => 'bar'})
759
- end
760
- end if Hash.method_defined? :select!
761
-
762
- describe :shift do
763
- it 'removes from the hash' do
764
- jar = cookies('foo=bar')
765
- expect(jar.shift).to eq(['foo', 'bar'])
766
- expect(jar).not_to include('bar')
767
- end
768
- end
769
-
770
- describe :size do
771
- it { expect(cookies.size).to eq(0) }
772
- it { expect(cookies('foo=bar').size).to eq(1) }
773
- end
774
-
775
- describe :update do
776
- it 'creates cookies' do
777
- jar = cookies('foo=bar')
778
- jar.update :bar => 'baz'
779
- expect(jar).to include('bar')
780
- end
781
-
782
- it 'overrides existing values' do
783
- jar = cookies('foo=bar')
784
- jar.update :foo => "baz"
785
- expect(jar["foo"]).to eq("baz")
786
- end
787
-
788
- it 'takes a block for conflict resolution' do
789
- merge = {'foo' => 'baz', 'bar' => 'baz'}
790
- jar = cookies('foo=bar')
791
- jar.update(merge) do |key, old, other|
792
- expect(key).to eq('foo')
793
- expect(old).to eq('bar')
794
- expect(other).to eq('baz')
795
- 'foo'
796
- end
797
- expect(jar['foo']).to eq('foo')
798
- end
799
- end
800
-
801
- describe :value? do
802
- it 'checks request cookies' do
803
- expect(cookies('foo=bar').value?('bar')).to be true
804
- end
805
-
806
- it 'checks response cookies' do
807
- jar = cookies
808
- jar[:foo] = 'bar'
809
- expect(jar.value?('bar')).to be true
810
- end
811
-
812
- it 'does not use deleted cookies' do
813
- jar = cookies('foo=bar')
814
- jar.delete :foo
815
- expect(jar.value?('bar')).to be false
816
- end
817
- end
818
-
819
- describe :values do
820
- it { expect(cookies('foo=bar', 'bar=baz').values.sort).to eq(['bar', 'baz']) }
821
- end
822
-
823
- describe :values_at do
824
- it { expect(cookies('foo=bar', 'bar=baz').values_at('foo')).to eq(['bar']) }
825
- end
826
- end