roda 3.28.0 → 3.29.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 (188) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +10 -0
  3. data/README.rdoc +10 -0
  4. data/doc/release_notes/3.29.0.txt +15 -0
  5. data/lib/roda.rb +1 -0
  6. data/lib/roda/plugins/caching.rb +2 -0
  7. data/lib/roda/plugins/common_logger.rb +1 -1
  8. data/lib/roda/plugins/exception_page.rb +7 -1
  9. data/lib/roda/plugins/indifferent_params.rb +2 -0
  10. data/lib/roda/version.rb +1 -1
  11. metadata +4 -214
  12. data/Rakefile +0 -108
  13. data/doc/release_notes/1.0.0.txt +0 -329
  14. data/doc/release_notes/1.1.0.txt +0 -226
  15. data/doc/release_notes/1.2.0.txt +0 -406
  16. data/doc/release_notes/1.3.0.txt +0 -109
  17. data/doc/release_notes/2.0.0.txt +0 -75
  18. data/doc/release_notes/2.1.0.txt +0 -124
  19. data/doc/release_notes/2.10.0.txt +0 -27
  20. data/doc/release_notes/2.11.0.txt +0 -70
  21. data/doc/release_notes/2.12.0.txt +0 -40
  22. data/doc/release_notes/2.13.0.txt +0 -10
  23. data/doc/release_notes/2.14.0.txt +0 -44
  24. data/doc/release_notes/2.15.0.txt +0 -53
  25. data/doc/release_notes/2.16.0.txt +0 -48
  26. data/doc/release_notes/2.17.0.txt +0 -62
  27. data/doc/release_notes/2.18.0.txt +0 -69
  28. data/doc/release_notes/2.19.0.txt +0 -30
  29. data/doc/release_notes/2.2.0.txt +0 -97
  30. data/doc/release_notes/2.20.0.txt +0 -5
  31. data/doc/release_notes/2.21.0.txt +0 -17
  32. data/doc/release_notes/2.22.0.txt +0 -41
  33. data/doc/release_notes/2.23.0.txt +0 -29
  34. data/doc/release_notes/2.24.0.txt +0 -65
  35. data/doc/release_notes/2.25.0.txt +0 -14
  36. data/doc/release_notes/2.26.0.txt +0 -13
  37. data/doc/release_notes/2.27.0.txt +0 -56
  38. data/doc/release_notes/2.28.0.txt +0 -17
  39. data/doc/release_notes/2.29.0.txt +0 -156
  40. data/doc/release_notes/2.3.0.txt +0 -109
  41. data/doc/release_notes/2.4.0.txt +0 -55
  42. data/doc/release_notes/2.5.0.txt +0 -23
  43. data/doc/release_notes/2.5.1.txt +0 -4
  44. data/doc/release_notes/2.6.0.txt +0 -21
  45. data/doc/release_notes/2.7.0.txt +0 -75
  46. data/doc/release_notes/2.8.0.txt +0 -44
  47. data/doc/release_notes/2.9.0.txt +0 -6
  48. data/spec/all.rb +0 -1
  49. data/spec/assets/css/app.scss +0 -1
  50. data/spec/assets/css/no_access.css +0 -1
  51. data/spec/assets/css/raw.css +0 -1
  52. data/spec/assets/js/head/app.js +0 -1
  53. data/spec/composition_spec.rb +0 -31
  54. data/spec/define_roda_method_spec.rb +0 -274
  55. data/spec/env_spec.rb +0 -11
  56. data/spec/freeze_spec.rb +0 -37
  57. data/spec/integration_spec.rb +0 -209
  58. data/spec/matchers_spec.rb +0 -832
  59. data/spec/opts_spec.rb +0 -42
  60. data/spec/plugin/_after_hook_spec.rb +0 -19
  61. data/spec/plugin/all_verbs_spec.rb +0 -29
  62. data/spec/plugin/assets_preloading_spec.rb +0 -98
  63. data/spec/plugin/assets_spec.rb +0 -745
  64. data/spec/plugin/backtracking_array_spec.rb +0 -42
  65. data/spec/plugin/branch_locals_spec.rb +0 -106
  66. data/spec/plugin/caching_spec.rb +0 -337
  67. data/spec/plugin/chunked_spec.rb +0 -201
  68. data/spec/plugin/class_level_routing_spec.rb +0 -164
  69. data/spec/plugin/class_matchers_spec.rb +0 -40
  70. data/spec/plugin/common_logger_spec.rb +0 -85
  71. data/spec/plugin/content_for_spec.rb +0 -162
  72. data/spec/plugin/content_security_policy_spec.rb +0 -175
  73. data/spec/plugin/cookies_spec.rb +0 -51
  74. data/spec/plugin/csrf_spec.rb +0 -111
  75. data/spec/plugin/default_headers_spec.rb +0 -82
  76. data/spec/plugin/default_status_spec.rb +0 -95
  77. data/spec/plugin/delay_build_spec.rb +0 -23
  78. data/spec/plugin/delegate_spec.rb +0 -23
  79. data/spec/plugin/delete_empty_headers_spec.rb +0 -27
  80. data/spec/plugin/direct_call_spec.rb +0 -28
  81. data/spec/plugin/disallow_file_uploads_spec.rb +0 -25
  82. data/spec/plugin/drop_body_spec.rb +0 -24
  83. data/spec/plugin/early_hints_spec.rb +0 -19
  84. data/spec/plugin/empty_root_spec.rb +0 -14
  85. data/spec/plugin/environments_spec.rb +0 -42
  86. data/spec/plugin/error_email_spec.rb +0 -97
  87. data/spec/plugin/error_handler_spec.rb +0 -216
  88. data/spec/plugin/error_mail_spec.rb +0 -93
  89. data/spec/plugin/exception_page_spec.rb +0 -168
  90. data/spec/plugin/flash_spec.rb +0 -121
  91. data/spec/plugin/h_spec.rb +0 -11
  92. data/spec/plugin/halt_spec.rb +0 -119
  93. data/spec/plugin/hash_matcher_spec.rb +0 -27
  94. data/spec/plugin/hash_routes_spec.rb +0 -535
  95. data/spec/plugin/head_spec.rb +0 -52
  96. data/spec/plugin/header_matchers_spec.rb +0 -98
  97. data/spec/plugin/heartbeat_spec.rb +0 -74
  98. data/spec/plugin/hooks_spec.rb +0 -152
  99. data/spec/plugin/indifferent_params_spec.rb +0 -14
  100. data/spec/plugin/json_parser_spec.rb +0 -141
  101. data/spec/plugin/json_spec.rb +0 -83
  102. data/spec/plugin/mail_processor_spec.rb +0 -451
  103. data/spec/plugin/mailer_spec.rb +0 -282
  104. data/spec/plugin/match_affix_spec.rb +0 -43
  105. data/spec/plugin/match_hook_spec.rb +0 -79
  106. data/spec/plugin/middleware_spec.rb +0 -237
  107. data/spec/plugin/middleware_stack_spec.rb +0 -81
  108. data/spec/plugin/module_include_spec.rb +0 -48
  109. data/spec/plugin/multi_route_spec.rb +0 -268
  110. data/spec/plugin/multi_run_spec.rb +0 -87
  111. data/spec/plugin/multi_view_spec.rb +0 -50
  112. data/spec/plugin/multibyte_string_matcher_spec.rb +0 -44
  113. data/spec/plugin/named_templates_spec.rb +0 -96
  114. data/spec/plugin/not_allowed_spec.rb +0 -69
  115. data/spec/plugin/not_found_spec.rb +0 -128
  116. data/spec/plugin/optimized_string_matchers_spec.rb +0 -43
  117. data/spec/plugin/padrino_render_spec.rb +0 -34
  118. data/spec/plugin/param_matchers_spec.rb +0 -69
  119. data/spec/plugin/params_capturing_spec.rb +0 -33
  120. data/spec/plugin/partials_spec.rb +0 -43
  121. data/spec/plugin/pass_spec.rb +0 -29
  122. data/spec/plugin/path_matchers_spec.rb +0 -42
  123. data/spec/plugin/path_rewriter_spec.rb +0 -45
  124. data/spec/plugin/path_spec.rb +0 -222
  125. data/spec/plugin/placeholder_string_matchers_spec.rb +0 -126
  126. data/spec/plugin/precompile_templates_spec.rb +0 -61
  127. data/spec/plugin/public_spec.rb +0 -85
  128. data/spec/plugin/render_each_spec.rb +0 -82
  129. data/spec/plugin/render_locals_spec.rb +0 -114
  130. data/spec/plugin/render_spec.rb +0 -912
  131. data/spec/plugin/request_aref_spec.rb +0 -51
  132. data/spec/plugin/request_headers_spec.rb +0 -39
  133. data/spec/plugin/response_request_spec.rb +0 -43
  134. data/spec/plugin/route_block_args_spec.rb +0 -86
  135. data/spec/plugin/route_csrf_spec.rb +0 -305
  136. data/spec/plugin/run_append_slash_spec.rb +0 -77
  137. data/spec/plugin/run_handler_spec.rb +0 -53
  138. data/spec/plugin/sessions_spec.rb +0 -452
  139. data/spec/plugin/shared_vars_spec.rb +0 -45
  140. data/spec/plugin/sinatra_helpers_spec.rb +0 -537
  141. data/spec/plugin/slash_path_empty_spec.rb +0 -22
  142. data/spec/plugin/static_routing_spec.rb +0 -192
  143. data/spec/plugin/static_spec.rb +0 -30
  144. data/spec/plugin/status_303_spec.rb +0 -28
  145. data/spec/plugin/status_handler_spec.rb +0 -158
  146. data/spec/plugin/streaming_spec.rb +0 -246
  147. data/spec/plugin/strip_path_prefix_spec.rb +0 -24
  148. data/spec/plugin/symbol_matchers_spec.rb +0 -51
  149. data/spec/plugin/symbol_status_spec.rb +0 -25
  150. data/spec/plugin/symbol_views_spec.rb +0 -32
  151. data/spec/plugin/timestamp_public_spec.rb +0 -85
  152. data/spec/plugin/type_routing_spec.rb +0 -348
  153. data/spec/plugin/typecast_params_spec.rb +0 -1370
  154. data/spec/plugin/unescape_path_spec.rb +0 -22
  155. data/spec/plugin/view_options_spec.rb +0 -170
  156. data/spec/plugin_spec.rb +0 -71
  157. data/spec/redirect_spec.rb +0 -41
  158. data/spec/request_spec.rb +0 -97
  159. data/spec/response_spec.rb +0 -199
  160. data/spec/route_spec.rb +0 -39
  161. data/spec/session_middleware_spec.rb +0 -129
  162. data/spec/session_spec.rb +0 -37
  163. data/spec/spec_helper.rb +0 -137
  164. data/spec/version_spec.rb +0 -14
  165. data/spec/views/_test.erb +0 -1
  166. data/spec/views/a.erb +0 -1
  167. data/spec/views/a.rdoc +0 -2
  168. data/spec/views/about.erb +0 -1
  169. data/spec/views/about.str +0 -1
  170. data/spec/views/about/_test.css.gz +0 -0
  171. data/spec/views/about/_test.erb +0 -1
  172. data/spec/views/about/_test.erb.gz +0 -0
  173. data/spec/views/about/comp_test.erb +0 -1
  174. data/spec/views/b.erb +0 -1
  175. data/spec/views/c.erb +0 -1
  176. data/spec/views/comp_layout.erb +0 -1
  177. data/spec/views/comp_test.erb +0 -1
  178. data/spec/views/content-yield.erb +0 -1
  179. data/spec/views/each.str +0 -1
  180. data/spec/views/home.erb +0 -2
  181. data/spec/views/home.str +0 -2
  182. data/spec/views/iv.erb +0 -1
  183. data/spec/views/layout-alternative.erb +0 -2
  184. data/spec/views/layout-yield.erb +0 -3
  185. data/spec/views/layout.erb +0 -2
  186. data/spec/views/layout.str +0 -2
  187. data/spec/views/multiple-layout.erb +0 -1
  188. data/spec/views/multiple.erb +0 -1
@@ -1,82 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "default_headers plugin" do
4
- it "sets the default headers to use for the response" do
5
- h = {'Content-Type'=>'text/json', 'Foo'=>'bar'}
6
-
7
- app(:bare) do
8
- plugin :default_headers, h
9
- route do |r|
10
- r.halt response.finish_with_body([])
11
- end
12
- end
13
-
14
- req[1].must_equal h
15
- req[1].wont_be_same_as h
16
- end
17
-
18
- it "should not override existing default headers" do
19
- h = {'Content-Type'=>'text/json', 'Foo'=>'bar'}
20
-
21
- app(:bare) do
22
- plugin :default_headers, h
23
- plugin :default_headers
24
-
25
- route do |r|
26
- r.halt response.finish_with_body([])
27
- end
28
- end
29
-
30
- req[1].must_equal h
31
- end
32
-
33
- it "should allow modifying the default headers by reloading the plugin" do
34
- app(:bare) do
35
- plugin :default_headers, 'Content-Type' => 'text/json'
36
- plugin :default_headers, 'Foo' => 'baz'
37
-
38
- route do |r|
39
- r.halt response.finish_with_body([])
40
- end
41
- end
42
-
43
- req[1].must_equal('Content-Type'=>'text/json', 'Foo'=>'baz')
44
- end
45
-
46
- it "should have a default Content-Type header" do
47
- h = {'Foo'=>'bar'}
48
-
49
- app(:bare) do
50
- plugin :default_headers, h
51
-
52
- route do |r|
53
- r.halt response.finish_with_body([])
54
- end
55
- end
56
-
57
- req[1].must_equal('Content-Type'=>'text/html', 'Foo'=>'bar')
58
- end
59
-
60
- it "should work correctly in subclasses" do
61
- h = {'Content-Type'=>'text/json', 'Foo'=>'bar'}
62
-
63
- app(:bare) do
64
- plugin :default_headers, h
65
-
66
- route do |r|
67
- r.halt response.finish_with_body([])
68
- end
69
- end
70
-
71
- @app = Class.new(@app)
72
-
73
- req[1].must_equal h
74
- end
75
-
76
- it "should offer default_headers method on class and response instance" do
77
- h = {'Content-Type'=>'text/json', 'Foo'=>'bar'}
78
- app.plugin :default_headers, h
79
- app.default_headers.must_equal h
80
- app::RodaResponse.new.default_headers.must_equal h
81
- end
82
- end
@@ -1,95 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "default_status plugin" do
4
- it "sets the default response status to use for the response" do
5
- app(:bare) do
6
- plugin :default_status do
7
- 201
8
- end
9
- route do |r|
10
- r.halt response.finish_with_body([])
11
- end
12
- end
13
-
14
- status.must_equal 201
15
- end
16
-
17
- it "should exec the plugin block in the context of the instance" do
18
- app(:bare) do
19
- plugin :default_status do
20
- 200 + @body[0].length
21
- end
22
- route do |r|
23
- r.path_info
24
- end
25
- end
26
-
27
- status.must_equal 201
28
- status('/foo').must_equal 204
29
- end
30
-
31
- it "should not override existing response" do
32
- app(:bare) do
33
- plugin :default_status do
34
- 201
35
- end
36
-
37
- route do |r|
38
- response.status = 202
39
- r.halt response.finish_with_body([])
40
- end
41
- end
42
-
43
- status.must_equal 202
44
- end
45
-
46
- it "should work correctly in subclasses" do
47
- app(:bare) do
48
- plugin :default_status do
49
- 201
50
- end
51
-
52
- route do |r|
53
- r.halt response.finish_with_body([])
54
- end
55
- end
56
-
57
- @app = Class.new(@app)
58
-
59
- status.must_equal 201
60
- end
61
-
62
- it "should raise if not given a block" do
63
- proc{app(:default_status)}.must_raise Roda::RodaError
64
- end
65
-
66
- [true, false].each do |warn_arity|
67
- send(warn_arity ? :deprecated : :it, "works with blocks with invalid arity") do
68
- app(:bare) do
69
- opts[:check_arity] = :warn if warn_arity
70
- plugin :default_status do |r|
71
- 201
72
- end
73
- route do |r|
74
- r.halt response.finish_with_body([])
75
- end
76
- end
77
-
78
- status.must_equal 201
79
- end
80
- end
81
-
82
- it "does not work with blocks with invalid arity if :check_arity app option is false" do
83
- app(:bare) do
84
- opts[:check_arity] = false
85
- plugin :default_status do |r|
86
- 201
87
- end
88
- route do |r|
89
- r.halt response.finish_with_body([])
90
- end
91
- end
92
-
93
- proc{status}.must_raise ArgumentError
94
- end
95
- end
@@ -1,23 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "delay_build plugin" do
4
- it "does not build rack app until app is called" do
5
- app(:delay_build){"a"}
6
- app.instance_variable_get(:@app).must_be_nil
7
- body.must_equal "a"
8
- # Work around minitest bug
9
- refute_equal app.instance_variable_get(:@app), nil
10
- end
11
-
12
- it "supports the build! method for backwards compatibility" do
13
- app(:delay_build){"a"}
14
- body.must_equal "a"
15
- c = Class.new do
16
- def initialize(_) end
17
- def call(_) [200, {}, ["b"]] end
18
- end
19
- app.use c
20
- app.build!
21
- body.must_equal "b"
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "delegate plugin" do
4
- it "adds request_delegate and response_delegate class methods for delegating" do
5
- app(:bare) do
6
- plugin :delegate
7
- request_delegate :root
8
- response_delegate :headers
9
-
10
- def self.a; 'foo'; end
11
- class_delegate :a
12
-
13
- route do
14
- root do
15
- headers['Content-Type'] = a
16
- end
17
- end
18
- end
19
-
20
- header('Content-Type').must_equal 'foo'
21
- status('/foo').must_equal 404
22
- end
23
- end
@@ -1,27 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "delete_empty_headers plugin" do
4
- it "automatically deletes headers that are empty" do
5
- app(:delete_empty_headers) do |r|
6
- response['Foo'] = ''
7
- response['Content-Type'] = ''
8
- response['Content-Length'] = ''
9
- response['Bar'] = '1'
10
- 'a'
11
- end
12
-
13
- req[1].must_equal('Bar'=>'1')
14
- end
15
-
16
- it "is called when finishing with a body" do
17
- app(:delete_empty_headers) do |r|
18
- response['Foo'] = ''
19
- response['Content-Type'] = ''
20
- response['Content-Length'] = ''
21
- response['Bar'] = '1'
22
- r.halt response.finish_with_body(['a'])
23
- end
24
-
25
- req[1].must_equal('Bar'=>'1')
26
- end
27
- end
@@ -1,28 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "direct_call plugin" do
4
- it "should have .call skip middleware" do
5
- app{'123'}
6
- app.use(Class.new do
7
- def initialize(_) end
8
- def call(env) [200, {}, ['321']] end
9
- end)
10
- body.must_equal '321'
11
- app.plugin :direct_call
12
- body.must_equal '123'
13
- end
14
-
15
- deprecated "should work when #call is overridden" do
16
- app.class_eval do
17
- def call; super end
18
- route{'123'}
19
- end
20
- app.use(Class.new do
21
- def initialize(_) end
22
- def call(env) [200, {}, ['321']] end
23
- end)
24
- body.must_equal '321'
25
- app.plugin :direct_call
26
- body.must_equal '123'
27
- end
28
- end
@@ -1,25 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- if Rack.release < '1.6'
4
- warn "Rack #{Rack.release} used, skipping disallow_file_uploads plugin test"
5
- else
6
- describe "disallow_file_uploads plugin" do
7
- it "disallows the uploading of files" do
8
- app do |r|
9
- r.params['foo'][:tempfile].read
10
- end
11
-
12
- request_body = StringIO.new("------WebKitFormBoundarymwHIM9XjTTVHn3YP\r\nContent-Disposition: form-data; name=\"foo\"; filename=\"bar.txt\"\r\nContent-Type: text/plain\r\n\r\nfoo\n\r\n------WebKitFormBoundarymwHIM9XjTTVHn3YP--\r\n")
13
-
14
- h = {
15
- 'rack.input'=>request_body,
16
- 'CONTENT_TYPE'=>'multipart/form-data; boundary=----WebKitFormBoundarymwHIM9XjTTVHn3YP',
17
- 'CONTENT_LENGTH'=>'184',
18
- 'REQUEST_METHOD'=>'POST'
19
- }
20
- body(h.dup).must_equal "foo\n"
21
- app.plugin :disallow_file_uploads
22
- proc{body(h.dup)}.must_raise Roda::RodaPlugins::DisallowFileUploads::Error
23
- end
24
- end
25
- end
@@ -1,24 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "drop_body plugin" do
4
- it "automatically drops body and Content-Type/Content-Length headers for responses without a body" do
5
- app(:drop_body) do |r|
6
- response.status = r.path.to_i
7
- response.write('a')
8
- end
9
-
10
- [101, 102, 204, 304].each do |i|
11
- body(i.to_s).must_equal ''
12
- header('Content-Type', i.to_s).must_be_nil
13
- header('Content-Length', i.to_s).must_be_nil
14
- end
15
-
16
- body('205').must_equal ''
17
- header('Content-Type', '205').must_be_nil
18
- header('Content-Length', '205').must_equal '0'
19
-
20
- body('200').must_equal 'a'
21
- header('Content-Type', '200').must_equal 'text/html'
22
- header('Content-Length', '200').must_equal '1'
23
- end
24
- end
@@ -1,19 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "early_hints plugin" do
4
- it "allows sending early hints to rack.early_hints" do
5
- queue = []
6
- app(:early_hints) do |r|
7
- send_early_hints('Link'=>'</foo.js>; rel=preload; as=script')
8
- queue << 'OK'
9
- 'OK'
10
- end
11
-
12
- body.must_equal 'OK'
13
- queue.must_equal ['OK']
14
-
15
- queue = []
16
- body('rack.early_hints'=>proc{|h| queue << h}).must_equal 'OK'
17
- queue.must_equal [{'Link'=>'</foo.js>; rel=preload; as=script'}, 'OK']
18
- end
19
- end
@@ -1,14 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "empty_root plugin" do
4
- it "makes root match on emtpy path" do
5
- app(:empty_root) do |r|
6
- r.root{"root"}
7
- "notroot"
8
- end
9
-
10
- body.must_equal 'root'
11
- body("").must_equal 'root'
12
- body("a").must_equal 'notroot'
13
- end
14
- end
@@ -1,42 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "environments plugin" do
4
- before do
5
- app
6
- app.plugin :environments, :development
7
- end
8
-
9
- it "adds environment accessor for getting/setting the environment" do
10
- app.environment.must_equal :development
11
- app.environment = :test
12
- app.environment.must_equal :test
13
-
14
- app.plugin :environments, :production
15
- app.environment.must_equal :production
16
- end
17
-
18
- it "adds predicates for testing the environment" do
19
- app.development?.must_equal true
20
- app.test?.must_equal false
21
- app.production?.must_equal false
22
- end
23
-
24
- it "adds configure method which yields if no arguments are given or an environment matches" do
25
- a = []
26
- app.configure{a << 1}
27
- app.configure(:development){|ap| a << ap}
28
- app.configure(:test, :production){a << 2}
29
- a.must_equal [1, app]
30
- end
31
-
32
- it "defaults environment to RACK_ENV" do
33
- with_rack_env('test') do
34
- app(:environments){}
35
- end
36
- app.test?.must_equal true
37
- app.development?.must_equal false
38
- app(:environments){}
39
- app.test?.must_equal false
40
- app.development?.must_equal true
41
- end
42
- end
@@ -1,97 +0,0 @@
1
- require_relative "../spec_helper"
2
-
3
- describe "error_email plugin" do
4
- def app(opts={})
5
- @emails = emails = [] unless defined?(@emails)
6
- @app ||= super(:bare) do
7
- plugin :error_email, {:to=>'t', :from=>'f', :emailer=>lambda{|h| emails << h}}.merge(opts)
8
-
9
- route do |r|
10
- r.get('noerror'){error_email("Problem"); 'g'}
11
- raise ArgumentError, 'bad foo' rescue error_email($!)
12
- 'e'
13
- end
14
- end
15
- end
16
-
17
- def email
18
- @emails.last
19
- end
20
-
21
- it "adds error_email method for emailing exceptions" do
22
- app
23
- body('rack.input'=>StringIO.new, 'QUERY_STRING'=>'b=c', 'rack.session'=>{'d'=>'e'}).must_equal 'e'
24
- email[:to].must_equal 't'
25
- email[:from].must_equal 'f'
26
- email[:host].must_equal 'localhost'
27
- email[:message].must_match(/^Subject: ArgumentError: bad foo/)
28
- email[:message].must_match(/^Backtrace:$.+^ENV:$.+^"rack\.input" => .+^Params:$\s+^"b" => "c"$\s+^Session:$\s+^"d" => "e"$/m)
29
- end
30
-
31
- it "have error_email method support string arguments" do
32
- app
33
- body('/noerror', 'rack.input'=>StringIO.new, 'QUERY_STRING'=>'b=c', 'rack.session'=>{'d'=>'e'}).must_equal 'g'
34
- email[:to].must_equal 't'
35
- email[:from].must_equal 'f'
36
- email[:host].must_equal 'localhost'
37
- email[:message].must_match(/^Subject: Problem/)
38
- email[:message].must_match(/^ENV:$.+^"rack\.input" => .+^Params:$\s+^"b" => "c"$\s+^Session:$\s+^"d" => "e"$/m)
39
- email[:message].wont_include('Backtrace')
40
- end
41
-
42
- it "supports error_email_content for the content of the email" do
43
- app.route do |r|
44
- raise ArgumentError, 'bad foo' rescue error_email_content($!)
45
- end
46
- b = body('rack.input'=>StringIO.new, 'QUERY_STRING'=>'b=c', 'rack.session'=>{'d'=>'e'})
47
- b.must_match(/^Subject: ArgumentError: bad foo/)
48
- b.must_match(/^Backtrace:$.+^ENV:$.+^"rack\.input" => .+^Params:$\s+^"b" => "c"$\s+^Session:$\s+^"d" => "e"$/m)
49
- end
50
-
51
- it "uses :host option" do
52
- app(:host=>'foo.bar.com')
53
- body('rack.input'=>StringIO.new).must_equal 'e'
54
- email[:host].must_equal 'foo.bar.com'
55
- end
56
-
57
- it "handles error messages with new lines" do
58
- app.route do |r|
59
- raise "foo\nbar\nbaz" rescue error_email($!)
60
- 'e'
61
- end
62
- body('rack.input'=>StringIO.new).must_equal 'e'
63
- email[:message].must_match %r{From: f\r\nSubject: RuntimeError: foo\r\n bar\r\n baz\r\nTo: t\r\n\r\n}
64
- end
65
-
66
- it "adds :prefix option to subject line" do
67
- app(:prefix=>'TEST ')
68
- body('rack.input'=>StringIO.new).must_equal 'e'
69
- email[:message].must_match(/^Subject: TEST ArgumentError/)
70
- end
71
-
72
- it "uses :headers option for additional headers" do
73
- app(:headers=>{'Foo'=>'Bar', 'Baz'=>'Quux'})
74
- body('rack.input'=>StringIO.new).must_equal 'e'
75
- email[:message].must_match(/^Foo: Bar/)
76
- email[:message].must_match(/^Baz: Quux/)
77
- end
78
-
79
- it "requires the :to and :from options" do
80
- proc{app :from=>nil}.must_raise(Roda::RodaError)
81
- proc{app :to=>nil}.must_raise(Roda::RodaError)
82
- end
83
-
84
- it "works correctly in subclasses" do
85
- @app = Class.new(app)
86
- @app.route do |r|
87
- raise ArgumentError rescue error_email($!)
88
- 'e'
89
- end
90
- body('rack.input'=>StringIO.new).must_equal 'e'
91
- email[:to].must_equal 't'
92
- email[:from].must_equal 'f'
93
- email[:host].must_equal 'localhost'
94
- email[:message].must_match(/^Subject: ArgumentError/)
95
- email[:message].must_match(/Backtrace.*ENV/m)
96
- end
97
- end