wested-rack-bug 0.2.2.1

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 (78) hide show
  1. data/.gitignore +3 -0
  2. data/History.txt +0 -0
  3. data/MIT-LICENSE.txt +19 -0
  4. data/README.rdoc +29 -0
  5. data/Rakefile +20 -0
  6. data/Thorfile +109 -0
  7. data/VERSION +1 -0
  8. data/lib/rack/bug.rb +43 -0
  9. data/lib/rack/bug/options.rb +89 -0
  10. data/lib/rack/bug/panel.rb +50 -0
  11. data/lib/rack/bug/panel_app.rb +33 -0
  12. data/lib/rack/bug/panels/active_record_panel.rb +45 -0
  13. data/lib/rack/bug/panels/active_record_panel/activerecord_extensions.rb +18 -0
  14. data/lib/rack/bug/panels/cache_panel.rb +50 -0
  15. data/lib/rack/bug/panels/cache_panel/memcache_extension.rb +129 -0
  16. data/lib/rack/bug/panels/cache_panel/panel_app.rb +48 -0
  17. data/lib/rack/bug/panels/cache_panel/stats.rb +97 -0
  18. data/lib/rack/bug/panels/log_panel.rb +39 -0
  19. data/lib/rack/bug/panels/log_panel/rails_extension.rb +11 -0
  20. data/lib/rack/bug/panels/memory_panel.rb +27 -0
  21. data/lib/rack/bug/panels/rails_info_panel.rb +23 -0
  22. data/lib/rack/bug/panels/redis_panel.rb +44 -0
  23. data/lib/rack/bug/panels/redis_panel/redis_extension.rb +14 -0
  24. data/lib/rack/bug/panels/redis_panel/stats.rb +48 -0
  25. data/lib/rack/bug/panels/request_variables_panel.rb +25 -0
  26. data/lib/rack/bug/panels/sql_panel.rb +55 -0
  27. data/lib/rack/bug/panels/sql_panel/panel_app.rb +37 -0
  28. data/lib/rack/bug/panels/sql_panel/query.rb +73 -0
  29. data/lib/rack/bug/panels/sql_panel/sql_extension.rb +11 -0
  30. data/lib/rack/bug/panels/templates_panel.rb +44 -0
  31. data/lib/rack/bug/panels/templates_panel/actionview_extension.rb +12 -0
  32. data/lib/rack/bug/panels/templates_panel/rendering.rb +67 -0
  33. data/lib/rack/bug/panels/templates_panel/trace.rb +34 -0
  34. data/lib/rack/bug/panels/timer_panel.rb +40 -0
  35. data/lib/rack/bug/params_signature.rb +65 -0
  36. data/lib/rack/bug/public/__rack_bug__/bookmarklet.html +10 -0
  37. data/lib/rack/bug/public/__rack_bug__/bookmarklet.js +215 -0
  38. data/lib/rack/bug/public/__rack_bug__/bug.css +211 -0
  39. data/lib/rack/bug/public/__rack_bug__/bug.js +84 -0
  40. data/lib/rack/bug/public/__rack_bug__/jquery-1.3.2.js +4376 -0
  41. data/lib/rack/bug/public/__rack_bug__/jquery.tablesorter.min.js +1 -0
  42. data/lib/rack/bug/public/__rack_bug__/spinner.gif +0 -0
  43. data/lib/rack/bug/render.rb +66 -0
  44. data/lib/rack/bug/toolbar.rb +137 -0
  45. data/lib/rack/bug/views/error.html.erb +16 -0
  46. data/lib/rack/bug/views/panels/active_record.html.erb +17 -0
  47. data/lib/rack/bug/views/panels/cache.html.erb +93 -0
  48. data/lib/rack/bug/views/panels/execute_sql.html.erb +32 -0
  49. data/lib/rack/bug/views/panels/explain_sql.html.erb +32 -0
  50. data/lib/rack/bug/views/panels/log.html.erb +23 -0
  51. data/lib/rack/bug/views/panels/profile_sql.html.erb +32 -0
  52. data/lib/rack/bug/views/panels/rails_info.html.erb +19 -0
  53. data/lib/rack/bug/views/panels/redis.html.erb +32 -0
  54. data/lib/rack/bug/views/panels/request_variables.html.erb +107 -0
  55. data/lib/rack/bug/views/panels/sql.html.erb +43 -0
  56. data/lib/rack/bug/views/panels/templates.html.erb +7 -0
  57. data/lib/rack/bug/views/panels/timer.html.erb +19 -0
  58. data/lib/rack/bug/views/panels/view_cache.html.erb +19 -0
  59. data/lib/rack/bug/views/redirect.html.erb +16 -0
  60. data/lib/rack/bug/views/toolbar.html.erb +42 -0
  61. data/spec/fixtures/config.ru +8 -0
  62. data/spec/fixtures/dummy_panel.rb +2 -0
  63. data/spec/fixtures/sample_app.rb +29 -0
  64. data/spec/rack/bug/panels/active_record_panel_spec.rb +30 -0
  65. data/spec/rack/bug/panels/cache_panel_spec.rb +159 -0
  66. data/spec/rack/bug/panels/log_panel_spec.rb +25 -0
  67. data/spec/rack/bug/panels/memory_panel_spec.rb +21 -0
  68. data/spec/rack/bug/panels/rails_info_panel_spec.rb +25 -0
  69. data/spec/rack/bug/panels/redis_panel_spec.rb +57 -0
  70. data/spec/rack/bug/panels/sql_panel_spec.rb +136 -0
  71. data/spec/rack/bug/panels/templates_panel_spec.rb +71 -0
  72. data/spec/rack/bug/panels/timer_panel_spec.rb +38 -0
  73. data/spec/rack/toolbar_spec.rb +100 -0
  74. data/spec/rcov.opts +1 -0
  75. data/spec/spec.opts +1 -0
  76. data/spec/spec_helper.rb +70 -0
  77. data/wested-rack-bug.gemspec +127 -0
  78. metadata +153 -0
@@ -0,0 +1,19 @@
1
+ <h3>Rails Environment</h3>
2
+ <table>
3
+ <thead>
4
+ <tr>
5
+ <th>Variable</th>
6
+ <th>Value</th>
7
+ </tr>
8
+ </thead>
9
+ <tbody>
10
+ <% i = 1 %>
11
+ <% Rails::Info.properties.each do |key, val| %>
12
+ <tr class="<%= i % 2 == 0 ? "even" : "odd" %>">
13
+ <td><%=h key %></td>
14
+ <td class="code"><div><%=h val %></div></td>
15
+ </tr>
16
+ <% i += 1 %>
17
+ <% end %>
18
+ </tbody>
19
+ </table>
@@ -0,0 +1,32 @@
1
+ <h3>Redis Usage</h3>
2
+ <table id="redis_usage">
3
+ <tr>
4
+ <th>Total Calls</th>
5
+ <td><%= stats.calls %></td>
6
+
7
+ <th>Total Time</th>
8
+ <td><%= stats.display_time %></td>
9
+ </tr>
10
+ </table>
11
+
12
+ <% if stats.queries.any? %>
13
+ <h3>Breakdown</h3>
14
+ <table id="redis_breakdown">
15
+ <thead>
16
+ <tr>
17
+ <th>Time&nbsp;(ms)</th>
18
+ <th>Command</th>
19
+ </tr>
20
+ </thead>
21
+ <tbody>
22
+ <% i = 1 %>
23
+ <% stats.queries.each do |query| %>
24
+ <tr class="<%= i % 2 == 0 ? "even" : "odd" %>">
25
+ <td><%= query.display_time %></td>
26
+ <td><%= query.command %></td>
27
+ </tr>
28
+ <% i += 1 %>
29
+ <% end %>
30
+ </tbody>
31
+ </table>
32
+ <% end %>
@@ -0,0 +1,107 @@
1
+ <% if request.GET.any? %>
2
+ <h3>GET</h3>
3
+ <table>
4
+ <thead>
5
+ <tr>
6
+ <th>Variable</th>
7
+ <th>Value</th>
8
+ </tr>
9
+ </thead>
10
+ <tbody>
11
+ <% i = 1 %>
12
+ <% request.GET.sort_by { |k, v| k.to_s }.each do |key, val| %>
13
+ <tr class="<%= i % 2 == 0 ? "even" : "odd" %>">
14
+ <td><%=h key %></td>
15
+ <td class="code"><div><%=h val %></div></td>
16
+ </tr>
17
+ <% i += 1 %>
18
+ <% end %>
19
+ </tbody>
20
+ </table>
21
+ <% end %>
22
+
23
+ <% if request.POST.any? %>
24
+ <h3>POST</h3>
25
+ <table>
26
+ <thead>
27
+ <tr>
28
+ <th>Variable</th>
29
+ <th>Value</th>
30
+ </tr>
31
+ </thead>
32
+ <tbody>
33
+ <% i = 1 %>
34
+ <% request.POST.sort_by { |k, v| k.to_s }.each do |key, val| %>
35
+ <tr class="<%= i % 2 == 0 ? "even" : "odd" %>">
36
+ <td><%=h key %></td>
37
+ <td class="code"><div><%=h val %></div></td>
38
+ </tr>
39
+ <% i += 1 %>
40
+ <% end %>
41
+ </tbody>
42
+ </table>
43
+ <% end %>
44
+
45
+ <% if request.env["rack.session"] && request.env["rack.session"].any? %>
46
+ <h3>Session</h3>
47
+ <table>
48
+ <thead>
49
+ <tr>
50
+ <th>Variable</th>
51
+ <th>Value</th>
52
+ </tr>
53
+ </thead>
54
+ <tbody>
55
+ <% i = 1 %>
56
+ <% request.env["rack.session"].sort_by { |k, v| k.to_s }.each do |key, val| %>
57
+ <tr class="<%= i % 2 == 0 ? "even" : "odd" %>">
58
+ <td><%=h key %></td>
59
+ <td class="code"><div><%=h val %></div></td>
60
+ </tr>
61
+ <% i += 1 %>
62
+ <% end %>
63
+ </tbody>
64
+ </table>
65
+ <% end %>
66
+
67
+ <% if request.env["rack.request.cookie_hash"] && request.env["rack.request.cookie_hash"].any? %>
68
+ <h3>Cookies</h3>
69
+ <table>
70
+ <thead>
71
+ <tr>
72
+ <th>Variable</th>
73
+ <th>Value</th>
74
+ </tr>
75
+ </thead>
76
+ <tbody>
77
+ <% i = 1 %>
78
+ <% request.env["rack.request.cookie_hash"].sort_by { |k, v| k.to_s }.each do |key, val| %>
79
+ <tr class="<%= i % 2 == 0 ? "even" : "odd" %>">
80
+ <td><%=h key %></td>
81
+ <td class="code"><div><%=h val %></div></td>
82
+ </tr>
83
+ <% i += 1 %>
84
+ <% end %>
85
+ </tbody>
86
+ </table>
87
+ <% end %>
88
+
89
+ <h3>Rack ENV</h3>
90
+ <table>
91
+ <thead>
92
+ <tr>
93
+ <th>Variable</th>
94
+ <th>Value</th>
95
+ </tr>
96
+ </thead>
97
+ <tbody>
98
+ <% i = 1 %>
99
+ <% env.sort_by { |k, v| k.to_s }.each do |key, val| %>
100
+ <tr class="<%= i % 2 == 0 ? "even" : "odd" %>">
101
+ <td><%=h key %></td>
102
+ <td class="code"><div><%=h val %></div></td>
103
+ </tr>
104
+ <% i += 1 %>
105
+ <% end %>
106
+ </tbody>
107
+ </table>
@@ -0,0 +1,43 @@
1
+ <h3>SQL Queries</h3>
2
+ <table class="sortable">
3
+ <thead>
4
+ <tr>
5
+ <th class="time">Time&nbsp;(ms)</th>
6
+ <th class="query">Query</th>
7
+ <th class="backtrace"></th>
8
+ <th class="actions"></th>
9
+ </tr>
10
+ </thead>
11
+ <tbody>
12
+ <% i = 1 %>
13
+ <% queries.each do |query| %>
14
+ <tr class="<%= i % 2 == 0 ? "even" : "odd" %>">
15
+ <td><%= query.human_time %></td>
16
+ <td class="syntax"><%= query.sql %></td>
17
+ <td>
18
+ <% if query.has_backtrace? %>
19
+ <a href="#" class="reveal_backtrace">Show Backtrace</a>
20
+ <% end %>
21
+ </td>
22
+ <td>
23
+ <% if query.inspectable? %>
24
+ <a href="/__rack_bug__/execute_sql?<%= signed_params("query" => query.sql, "time" => query.time) %>" class="remote_call">SELECT</a> |
25
+ <a href="/__rack_bug__/explain_sql?<%= signed_params("query" => query.sql, "time" => query.time) %>" class="remote_call">EXPLAIN</a> |
26
+ <a href="/__rack_bug__/profile_sql?<%= signed_params("query" => query.sql, "time" => query.time) %>" class="remote_call">Profile</a>
27
+ <% end %>
28
+ </td>
29
+ </tr>
30
+ <tr style="display:none">
31
+ <td></td>
32
+ <td colspan="3">
33
+ <ul>
34
+ <% query.filtered_backtrace.each do |line| %>
35
+ <li><%=h line %></li>
36
+ <% end %>
37
+ </ul>
38
+ </td>
39
+ </tr>
40
+ <% i += 1 %>
41
+ <% end %>
42
+ </tbody>
43
+ </table>
@@ -0,0 +1,7 @@
1
+ <h3>Templates</h3>
2
+
3
+ <ul>
4
+ <% template_trace.root.children.each do |child| %>
5
+ <%= child.html %>
6
+ <% end %>
7
+ </ul>
@@ -0,0 +1,19 @@
1
+ <h3>Resource Usage</h3>
2
+ <table class="sortable">
3
+ <thead>
4
+ <tr>
5
+ <th>Key</th>
6
+ <th>Value</th>
7
+ </tr>
8
+ </thead>
9
+ <tbody>
10
+ <% i = 1 %>
11
+ <% measurements.each do |key, val| %>
12
+ <tr class="<%= i % 2 == 0 ? "even" : "odd" %>">
13
+ <td><%=h key %></td>
14
+ <td><%=h val %></td>
15
+ </tr>
16
+ <% i += 1 %>
17
+ <% end %>
18
+ </tbody>
19
+ </table>
@@ -0,0 +1,19 @@
1
+ <a class="back" href="">&laquo;&nbsp;Back</a>
2
+
3
+ <h3>Cache Read</h3>
4
+
5
+ <dl>
6
+ <dt>Key</dt>
7
+ <dd><pre><%=h key %></pre></dd>
8
+
9
+ <dt>Time</dt>
10
+ <dd><%=h "%.2f" % (0.0 * 1_000) %>ms</dd>
11
+ </dl>
12
+
13
+ <p>
14
+ <% if value.is_a?(String )%>
15
+ <%=h value %>
16
+ <% else %>
17
+ <%=h value.inspect %>
18
+ <% end %>
19
+ </p>
@@ -0,0 +1,16 @@
1
+ <html>
2
+ <head>
3
+ </head>
4
+ <body>
5
+ <h1>Redirect</h1>
6
+
7
+ <p>Location: <a href="<%= redirect_to %>"><%= redirect_to %></a></p>
8
+
9
+ <p class="notice">
10
+ Rack::Bug has intercepted a redirect to the above URL for debug viewing
11
+ purposes. You can click the above link to continue with the redirect as
12
+ normal. If you'd like to disable this feature, set the Rack::Bug
13
+ <code>internal_redirects</code> option to <code>false</code>.
14
+ </p>
15
+ </body>
16
+ </html>
@@ -0,0 +1,42 @@
1
+ <script type="text/javascript" charset="utf-8">
2
+ if (typeof jQuery == 'undefined') {
3
+ var jquery_url = '/__rack_bug__/jquery-1.3.2.js';
4
+ document.write(unescape('%3Cscript src="' + jquery_url + '" type="text/javascript"%3E%3C/script%3E'));
5
+ }
6
+ </script>
7
+ <script type="text/javascript" src="/__rack_bug__/jquery.tablesorter.min.js"></script>
8
+ <script type="text/javascript" src="/__rack_bug__/bug.js"></script>
9
+ <style type="text/css" media="screen">
10
+ @import url(/__rack_bug__/bug.css);
11
+ </style>
12
+
13
+ <div id="rack_bug" class="rb_top">
14
+ <div id="rack_bug_toolbar">
15
+ <ul class="panels">
16
+ <li id="rb_debug_button">Rack::Bug</li>
17
+
18
+ <% panels.each do |panel| %>
19
+ <li>
20
+ <% if panel.has_content? %>
21
+ <a href="#" class="<%= panel.name %>">
22
+ <%= panel.heading %>
23
+ </a>
24
+ <% else %>
25
+ <%= panel.heading %>
26
+ <% end %>
27
+ </li>
28
+ <% end %>
29
+ </ul>
30
+ </div>
31
+
32
+ <% panels.each do |panel| %>
33
+ <% if panel.has_content? %>
34
+ <div class="panel_content" id="<%= panel.name %>">
35
+ <a href="" class="rack_bug_close">Close</a>
36
+ <%= panel.content %>
37
+ </div>
38
+ <% end %>
39
+ <% end %>
40
+
41
+ <div id="rack_bug_debug_window" class="panel_content"></div>
42
+ </div>
@@ -0,0 +1,8 @@
1
+ require "rubygems"
2
+ require "sample_app"
3
+
4
+ $LOAD_PATH.unshift File.dirname(File.dirname(__FILE__)) + '/../../lib'
5
+ require "rack/bug"
6
+
7
+ use Rack::Bug, :password => "secret"
8
+ run SampleApp
@@ -0,0 +1,2 @@
1
+ class DummyPanel < Rack::Bug::Panel
2
+ end
@@ -0,0 +1,29 @@
1
+ require "sinatra/base"
2
+
3
+ class SampleApp < Sinatra::Default
4
+
5
+ get "/redirect" do
6
+ redirect "/"
7
+ end
8
+
9
+ get "/error" do
10
+ raise "Error!"
11
+ end
12
+
13
+ get "/" do
14
+ if params[:content_type]
15
+ headers["Content-Type"] = params[:content_type]
16
+ end
17
+
18
+ <<-HTML
19
+ <html>
20
+ <head>
21
+ </head>
22
+ <body>
23
+ <p>Hello</p>
24
+ </body>
25
+ </html>
26
+ HTML
27
+ end
28
+
29
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+
3
+ module Rack::Bug
4
+ describe ActiveRecordPanel do
5
+ before do
6
+ ActiveRecordPanel.reset
7
+ header "rack-bug.panel_classes", [ActiveRecordPanel]
8
+ end
9
+
10
+ describe "heading" do
11
+ it "displays the total number of instantiated AR objects" do
12
+ ActiveRecordPanel.record("User")
13
+ ActiveRecordPanel.record("Group")
14
+ response = get "/"
15
+ response.should have_heading("2 AR Objects")
16
+ end
17
+ end
18
+
19
+ describe "content" do
20
+ it "displays the count of instantiated objects for each class" do
21
+ ActiveRecordPanel.record("User")
22
+ ActiveRecordPanel.record("User")
23
+ ActiveRecordPanel.record("Group")
24
+ response = get "/"
25
+ response.should have_row("#active_record", "User", "2")
26
+ response.should have_row("#active_record", "Group", "1")
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,159 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+
3
+ module Rack::Bug
4
+ describe CachePanel do
5
+ before do
6
+ CachePanel.reset
7
+ header "rack-bug.panel_classes", [CachePanel]
8
+ end
9
+
10
+ describe "heading" do
11
+ it "displays the total memcache time" do
12
+ response = get "/"
13
+ response.should have_heading("Cache: 0.00ms")
14
+ end
15
+ end
16
+
17
+ describe "content" do
18
+ describe "usage table" do
19
+ it "displays the total number of memcache calls" do
20
+ CachePanel.record(:get, "user:1") { }
21
+ response = get "/"
22
+
23
+ # This causes a bus error:
24
+ # response.should have_selector("th:content('Total Calls') + td", :content => "1")
25
+
26
+ response.should have_row("#cache_usage", "Total Calls", "1")
27
+ end
28
+
29
+ it "displays the total memcache time" do
30
+ response = get "/"
31
+ response.should have_row("#cache_usage", "Total Time", "0.00ms")
32
+ end
33
+
34
+ it "dispays the number of memcache hits" do
35
+ CachePanel.record(:get, "user:1") { }
36
+ response = get "/"
37
+ response.should have_row("#cache_usage", "Hits", "0")
38
+ end
39
+
40
+ it "displays the number of memcache misses" do
41
+ CachePanel.record(:get, "user:1") { }
42
+ response = get "/"
43
+ response.should have_row("#cache_usage", "Misses", "1")
44
+ end
45
+
46
+ it "displays the number of memcache gets" do
47
+ CachePanel.record(:get, "user:1") { }
48
+ response = get "/"
49
+ response.should have_row("#cache_usage", "gets", "1")
50
+ end
51
+
52
+ it "displays the number of memcache sets" do
53
+ CachePanel.record(:set, "user:1") { }
54
+ response = get "/"
55
+ response.should have_row("#cache_usage", "sets", "1")
56
+ end
57
+
58
+ it "displays the number of memcache deletes" do
59
+ CachePanel.record(:delete, "user:1") { }
60
+ response = get "/"
61
+ response.should have_row("#cache_usage", "deletes", "1")
62
+ end
63
+
64
+ it "displays the number of memcache get_multis" do
65
+ CachePanel.record(:get_multi, "user:1", "user:2") { }
66
+ response = get "/"
67
+ response.should have_row("#cache_usage", "get_multis", "1")
68
+ end
69
+ end
70
+
71
+ describe "breakdown" do
72
+ it "displays each memcache operation" do
73
+ CachePanel.record(:get, "user:1") { }
74
+ response = get "/"
75
+ response.should have_row("#cache_breakdown", "get")
76
+ end
77
+
78
+ it "displays the time for each memcache call" do
79
+ CachePanel.record(:get, "user:1") { }
80
+ response = get "/"
81
+ response.should have_row("#cache_breakdown", "user:1", TIME_MS_REGEXP)
82
+ end
83
+
84
+ it "displays the keys for each memcache call" do
85
+ CachePanel.record(:get, "user:1") { }
86
+ response = get "/"
87
+ response.should have_row("#cache_breakdown", "user:1", "get")
88
+ end
89
+ end
90
+ end
91
+
92
+ describe "expire_all" do
93
+ before do
94
+ header "rack-bug.secret_key", 'abc'
95
+ end
96
+
97
+ it "expires the cache keys" do
98
+ Rails.stub!(:cache => mock("cache"))
99
+ Rails.cache.should_receive(:delete).with("user:1")
100
+ Rails.cache.should_receive(:delete).with("user:2")
101
+ Rails.cache.should_receive(:delete).with("user:3")
102
+ Rails.cache.should_receive(:delete).with("user:4")
103
+
104
+ get "/__rack_bug__/delete_cache_list",
105
+ :keys_1 => "user:1", :keys_2 => "user:2", :keys_3 => "user:3", :keys_4 => "user:4",
106
+ :hash => "c367b76e0199c308862a3afd8fba32b8715e7976"
107
+ end
108
+
109
+ it "returns OK" do
110
+ Rails.stub!(:cache => mock("cache", :delete => nil))
111
+ response = get "/__rack_bug__/delete_cache_list",
112
+ :keys_1 => "user:1", :keys_2 => "user:2", :keys_3 => "user:3", :keys_4 => "user:4",
113
+ :hash => "c367b76e0199c308862a3afd8fba32b8715e7976"
114
+ response.should contain("OK")
115
+ end
116
+ end
117
+
118
+ describe "expire" do
119
+ before do
120
+ header "rack-bug.secret_key", 'abc'
121
+ end
122
+
123
+ it "expires the cache key" do
124
+ Rails.stub!(:cache => mock("cache"))
125
+ Rails.cache.should_receive(:delete).with("user:1")
126
+ get "/__rack_bug__/delete_cache", :key => "user:1",
127
+ :hash => "f87215442d312d8e42cf51e6b66fc3eb3d59ac74"
128
+ end
129
+
130
+ it "returns OK" do
131
+ Rails.stub!(:cache => mock("cache", :delete => nil))
132
+ response = get "/__rack_bug__/delete_cache", :key => "user:1",
133
+ :hash => "f87215442d312d8e42cf51e6b66fc3eb3d59ac74"
134
+ response.should contain("OK")
135
+ end
136
+ end
137
+
138
+ describe "view_cache" do
139
+ before do
140
+ header "rack-bug.secret_key", 'abc'
141
+ end
142
+
143
+ it "renders the cache key" do
144
+ Rails.stub!(:cache => mock("cache", :read => "cache body"))
145
+ response = get "/__rack_bug__/view_cache", :key => "user:1",
146
+ :hash => "f87215442d312d8e42cf51e6b66fc3eb3d59ac74"
147
+ response.should contain("cache body")
148
+ end
149
+
150
+ it "renders non-String cache values properly" do
151
+ Rails.stub!(:cache => mock("cache", :read => [1, 2]))
152
+ response = get "/__rack_bug__/view_cache", :key => "user:1",
153
+ :hash => "f87215442d312d8e42cf51e6b66fc3eb3d59ac74"
154
+ response.should contain("[1, 2]")
155
+ end
156
+ end
157
+
158
+ end
159
+ end