kastner-rack 0.3.171

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 (94) hide show
  1. data/AUTHORS +8 -0
  2. data/COPYING +18 -0
  3. data/KNOWN-ISSUES +18 -0
  4. data/README +273 -0
  5. data/Rakefile +185 -0
  6. data/bin/rackup +172 -0
  7. data/contrib/rack_logo.svg +111 -0
  8. data/example/lobster.ru +4 -0
  9. data/example/protectedlobster.rb +14 -0
  10. data/example/protectedlobster.ru +8 -0
  11. data/lib/rack.rb +85 -0
  12. data/lib/rack/adapter/camping.rb +22 -0
  13. data/lib/rack/auth/abstract/handler.rb +28 -0
  14. data/lib/rack/auth/abstract/request.rb +37 -0
  15. data/lib/rack/auth/basic.rb +58 -0
  16. data/lib/rack/auth/digest/md5.rb +124 -0
  17. data/lib/rack/auth/digest/nonce.rb +51 -0
  18. data/lib/rack/auth/digest/params.rb +55 -0
  19. data/lib/rack/auth/digest/request.rb +40 -0
  20. data/lib/rack/auth/openid.rb +437 -0
  21. data/lib/rack/builder.rb +67 -0
  22. data/lib/rack/cascade.rb +36 -0
  23. data/lib/rack/commonlogger.rb +61 -0
  24. data/lib/rack/conditionalget.rb +42 -0
  25. data/lib/rack/deflater.rb +63 -0
  26. data/lib/rack/directory.rb +149 -0
  27. data/lib/rack/file.rb +84 -0
  28. data/lib/rack/handler.rb +46 -0
  29. data/lib/rack/handler/cgi.rb +57 -0
  30. data/lib/rack/handler/evented_mongrel.rb +8 -0
  31. data/lib/rack/handler/fastcgi.rb +86 -0
  32. data/lib/rack/handler/lsws.rb +52 -0
  33. data/lib/rack/handler/mongrel.rb +78 -0
  34. data/lib/rack/handler/scgi.rb +57 -0
  35. data/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
  36. data/lib/rack/handler/webrick.rb +61 -0
  37. data/lib/rack/head.rb +19 -0
  38. data/lib/rack/lint.rb +463 -0
  39. data/lib/rack/lobster.rb +65 -0
  40. data/lib/rack/methodoverride.rb +21 -0
  41. data/lib/rack/mime.rb +204 -0
  42. data/lib/rack/mock.rb +160 -0
  43. data/lib/rack/recursive.rb +57 -0
  44. data/lib/rack/reloader.rb +64 -0
  45. data/lib/rack/request.rb +217 -0
  46. data/lib/rack/response.rb +171 -0
  47. data/lib/rack/session/abstract/id.rb +140 -0
  48. data/lib/rack/session/cookie.rb +89 -0
  49. data/lib/rack/session/memcache.rb +97 -0
  50. data/lib/rack/session/pool.rb +73 -0
  51. data/lib/rack/showexceptions.rb +348 -0
  52. data/lib/rack/showstatus.rb +105 -0
  53. data/lib/rack/static.rb +38 -0
  54. data/lib/rack/urlmap.rb +48 -0
  55. data/lib/rack/utils.rb +318 -0
  56. data/rack.gemspec +31 -0
  57. data/test/cgi/lighttpd.conf +20 -0
  58. data/test/cgi/test +9 -0
  59. data/test/cgi/test.fcgi +8 -0
  60. data/test/cgi/test.ru +7 -0
  61. data/test/spec_rack_auth_basic.rb +69 -0
  62. data/test/spec_rack_auth_digest.rb +169 -0
  63. data/test/spec_rack_auth_openid.rb +137 -0
  64. data/test/spec_rack_builder.rb +84 -0
  65. data/test/spec_rack_camping.rb +51 -0
  66. data/test/spec_rack_cascade.rb +50 -0
  67. data/test/spec_rack_cgi.rb +89 -0
  68. data/test/spec_rack_commonlogger.rb +32 -0
  69. data/test/spec_rack_conditionalget.rb +41 -0
  70. data/test/spec_rack_deflater.rb +70 -0
  71. data/test/spec_rack_directory.rb +56 -0
  72. data/test/spec_rack_fastcgi.rb +89 -0
  73. data/test/spec_rack_file.rb +57 -0
  74. data/test/spec_rack_handler.rb +24 -0
  75. data/test/spec_rack_head.rb +30 -0
  76. data/test/spec_rack_lint.rb +371 -0
  77. data/test/spec_rack_lobster.rb +45 -0
  78. data/test/spec_rack_methodoverride.rb +31 -0
  79. data/test/spec_rack_mock.rb +152 -0
  80. data/test/spec_rack_mongrel.rb +170 -0
  81. data/test/spec_rack_recursive.rb +77 -0
  82. data/test/spec_rack_request.rb +426 -0
  83. data/test/spec_rack_response.rb +173 -0
  84. data/test/spec_rack_session_cookie.rb +78 -0
  85. data/test/spec_rack_session_memcache.rb +132 -0
  86. data/test/spec_rack_session_pool.rb +84 -0
  87. data/test/spec_rack_showexceptions.rb +21 -0
  88. data/test/spec_rack_showstatus.rb +72 -0
  89. data/test/spec_rack_static.rb +37 -0
  90. data/test/spec_rack_urlmap.rb +175 -0
  91. data/test/spec_rack_utils.rb +174 -0
  92. data/test/spec_rack_webrick.rb +123 -0
  93. data/test/testrequest.rb +45 -0
  94. metadata +177 -0
@@ -0,0 +1,45 @@
1
+ require 'test/spec'
2
+
3
+ require 'rack/lobster'
4
+ require 'rack/mock'
5
+
6
+ context "Rack::Lobster::LambdaLobster" do
7
+ specify "should be a single lambda" do
8
+ Rack::Lobster::LambdaLobster.should.be.kind_of Proc
9
+ end
10
+
11
+ specify "should look like a lobster" do
12
+ res = Rack::MockRequest.new(Rack::Lobster::LambdaLobster).get("/")
13
+ res.should.be.ok
14
+ res.body.should.include "(,(,,(,,,("
15
+ res.body.should.include "?flip"
16
+ end
17
+
18
+ specify "should be flippable" do
19
+ res = Rack::MockRequest.new(Rack::Lobster::LambdaLobster).get("/?flip")
20
+ res.should.be.ok
21
+ res.body.should.include "(,,,(,,(,("
22
+ end
23
+ end
24
+
25
+ context "Rack::Lobster" do
26
+ specify "should look like a lobster" do
27
+ res = Rack::MockRequest.new(Rack::Lobster.new).get("/")
28
+ res.should.be.ok
29
+ res.body.should.include "(,(,,(,,,("
30
+ res.body.should.include "?flip"
31
+ res.body.should.include "crash"
32
+ end
33
+
34
+ specify "should be flippable" do
35
+ res = Rack::MockRequest.new(Rack::Lobster.new).get("/?flip=left")
36
+ res.should.be.ok
37
+ res.body.should.include "(,,,(,,(,("
38
+ end
39
+
40
+ specify "should provide crashing for testing purposes" do
41
+ lambda {
42
+ Rack::MockRequest.new(Rack::Lobster.new).get("/?flip=crash")
43
+ }.should.raise
44
+ end
45
+ end
@@ -0,0 +1,31 @@
1
+ require 'test/spec'
2
+
3
+ require 'rack/mock'
4
+ require 'rack/methodoverride'
5
+ require 'stringio'
6
+
7
+ context "Rack::MethodOverride" do
8
+ specify "should not affect GET requests" do
9
+ env = Rack::MockRequest.env_for("/?_method=delete", :method => "GET")
10
+ app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) })
11
+ req = app.call(env)
12
+
13
+ req.env["REQUEST_METHOD"].should.equal "GET"
14
+ end
15
+
16
+ specify "should modify REQUEST_METHOD for POST requests" do
17
+ env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=put")
18
+ app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) })
19
+ req = app.call(env)
20
+
21
+ req.env["REQUEST_METHOD"].should.equal "PUT"
22
+ end
23
+
24
+ specify "should not modify REQUEST_METHOD if the method is unknown" do
25
+ env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=foo")
26
+ app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) })
27
+ req = app.call(env)
28
+
29
+ req.env["REQUEST_METHOD"].should.equal "POST"
30
+ end
31
+ end
@@ -0,0 +1,152 @@
1
+ require 'yaml'
2
+ require 'rack/mock'
3
+ require 'rack/request'
4
+ require 'rack/response'
5
+
6
+ app = lambda { |env|
7
+ req = Rack::Request.new(env)
8
+
9
+ env["mock.postdata"] = env["rack.input"].read
10
+ if req.GET["error"]
11
+ env["rack.errors"].puts req.GET["error"]
12
+ env["rack.errors"].flush
13
+ end
14
+
15
+ Rack::Response.new(env.to_yaml,
16
+ req.GET["status"] || 200,
17
+ "Content-Type" => "text/yaml").finish
18
+ }
19
+
20
+ context "Rack::MockRequest" do
21
+ specify "should return a MockResponse" do
22
+ res = Rack::MockRequest.new(app).get("")
23
+ res.should.be.kind_of Rack::MockResponse
24
+ end
25
+
26
+ specify "should be able to only return the environment" do
27
+ env = Rack::MockRequest.env_for("")
28
+ env.should.be.kind_of Hash
29
+ env.should.include "rack.version"
30
+ end
31
+
32
+ specify "should provide sensible defaults" do
33
+ res = Rack::MockRequest.new(app).request
34
+
35
+ env = YAML.load(res.body)
36
+ env["REQUEST_METHOD"].should.equal "GET"
37
+ env["SERVER_NAME"].should.equal "example.org"
38
+ env["SERVER_PORT"].should.equal "80"
39
+ env["QUERY_STRING"].should.equal ""
40
+ env["PATH_INFO"].should.equal "/"
41
+ env["SCRIPT_NAME"].should.equal ""
42
+ env["rack.url_scheme"].should.equal "http"
43
+ env["mock.postdata"].should.be.empty
44
+ end
45
+
46
+ specify "should allow GET/POST/PUT/DELETE" do
47
+ res = Rack::MockRequest.new(app).get("", :input => "foo")
48
+ env = YAML.load(res.body)
49
+ env["REQUEST_METHOD"].should.equal "GET"
50
+
51
+ res = Rack::MockRequest.new(app).post("", :input => "foo")
52
+ env = YAML.load(res.body)
53
+ env["REQUEST_METHOD"].should.equal "POST"
54
+
55
+ res = Rack::MockRequest.new(app).put("", :input => "foo")
56
+ env = YAML.load(res.body)
57
+ env["REQUEST_METHOD"].should.equal "PUT"
58
+
59
+ res = Rack::MockRequest.new(app).delete("", :input => "foo")
60
+ env = YAML.load(res.body)
61
+ env["REQUEST_METHOD"].should.equal "DELETE"
62
+
63
+ Rack::MockRequest.env_for("/", :method => "OPTIONS")["REQUEST_METHOD"].
64
+ should.equal "OPTIONS"
65
+ end
66
+
67
+ specify "should allow posting" do
68
+ res = Rack::MockRequest.new(app).get("", :input => "foo")
69
+ env = YAML.load(res.body)
70
+ env["mock.postdata"].should.equal "foo"
71
+
72
+ res = Rack::MockRequest.new(app).post("", :input => StringIO.new("foo"))
73
+ env = YAML.load(res.body)
74
+ env["mock.postdata"].should.equal "foo"
75
+ end
76
+
77
+ specify "should use all parts of an URL" do
78
+ res = Rack::MockRequest.new(app).
79
+ get("https://bla.example.org:9292/meh/foo?bar")
80
+ res.should.be.kind_of Rack::MockResponse
81
+
82
+ env = YAML.load(res.body)
83
+ env["REQUEST_METHOD"].should.equal "GET"
84
+ env["SERVER_NAME"].should.equal "bla.example.org"
85
+ env["SERVER_PORT"].should.equal "9292"
86
+ env["QUERY_STRING"].should.equal "bar"
87
+ env["PATH_INFO"].should.equal "/meh/foo"
88
+ env["rack.url_scheme"].should.equal "https"
89
+ end
90
+
91
+ specify "should behave valid according to the Rack spec" do
92
+ lambda {
93
+ res = Rack::MockRequest.new(app).
94
+ get("https://bla.example.org:9292/meh/foo?bar", :lint => true)
95
+ }.should.not.raise(Rack::Lint::LintError)
96
+ end
97
+ end
98
+
99
+ context "Rack::MockResponse" do
100
+ specify "should provide access to the HTTP status" do
101
+ res = Rack::MockRequest.new(app).get("")
102
+ res.should.be.successful
103
+ res.should.be.ok
104
+
105
+ res = Rack::MockRequest.new(app).get("/?status=404")
106
+ res.should.not.be.successful
107
+ res.should.be.client_error
108
+ res.should.be.not_found
109
+
110
+ res = Rack::MockRequest.new(app).get("/?status=501")
111
+ res.should.not.be.successful
112
+ res.should.be.server_error
113
+
114
+ res = Rack::MockRequest.new(app).get("/?status=307")
115
+ res.should.be.redirect
116
+
117
+ res = Rack::MockRequest.new(app).get("/?status=201", :lint => true)
118
+ res.should.be.empty
119
+ end
120
+
121
+ specify "should provide access to the HTTP headers" do
122
+ res = Rack::MockRequest.new(app).get("")
123
+ res.should.include "Content-Type"
124
+ res.headers["Content-Type"].should.equal "text/yaml"
125
+ res.original_headers["Content-Type"].should.equal "text/yaml"
126
+ res["Content-Type"].should.equal "text/yaml"
127
+ res.content_type.should.equal "text/yaml"
128
+ res.content_length.should.be 381
129
+ res.location.should.be.nil
130
+ end
131
+
132
+ specify "should provide access to the HTTP body" do
133
+ res = Rack::MockRequest.new(app).get("")
134
+ res.body.should =~ /rack/
135
+ res.should =~ /rack/
136
+ res.should.match(/rack/)
137
+ res.should.satisfy { |r| r.match(/rack/) }
138
+ end
139
+
140
+ specify "should provide access to the Rack errors" do
141
+ res = Rack::MockRequest.new(app).get("/?error=foo", :lint => true)
142
+ res.should.be.ok
143
+ res.errors.should.not.be.empty
144
+ res.errors.should.include "foo"
145
+ end
146
+
147
+ specify "should optionally make Rack errors fatal" do
148
+ lambda {
149
+ Rack::MockRequest.new(app).get("/?error=foo", :fatal => true)
150
+ }.should.raise(Rack::MockRequest::FatalWarning)
151
+ end
152
+ end
@@ -0,0 +1,170 @@
1
+ require 'test/spec'
2
+
3
+ begin
4
+ require 'rack/handler/mongrel'
5
+ require 'rack/urlmap'
6
+ require 'rack/lint'
7
+ require 'testrequest'
8
+
9
+ Thread.abort_on_exception = true
10
+ $tcp_defer_accept_opts = nil
11
+ $tcp_cork_opts = nil
12
+
13
+ context "Rack::Handler::Mongrel" do
14
+ include TestRequest::Helpers
15
+
16
+ setup do
17
+ server = Mongrel::HttpServer.new(@host='0.0.0.0', @port=9201)
18
+ server.register('/test',
19
+ Rack::Handler::Mongrel.new(Rack::Lint.new(TestRequest.new)))
20
+ @acc = server.run
21
+ end
22
+
23
+ specify "should respond" do
24
+ lambda {
25
+ GET("/test")
26
+ }.should.not.raise
27
+ end
28
+
29
+ specify "should be a Mongrel" do
30
+ GET("/test")
31
+ status.should.be 200
32
+ response["SERVER_SOFTWARE"].should =~ /Mongrel/
33
+ response["HTTP_VERSION"].should.equal "HTTP/1.1"
34
+ response["SERVER_PROTOCOL"].should.equal "HTTP/1.1"
35
+ response["SERVER_PORT"].should.equal "9201"
36
+ response["SERVER_NAME"].should.equal "0.0.0.0"
37
+ end
38
+
39
+ specify "should have rack headers" do
40
+ GET("/test")
41
+ response["rack.version"].should.equal [0,1]
42
+ response["rack.multithread"].should.be true
43
+ response["rack.multiprocess"].should.be false
44
+ response["rack.run_once"].should.be false
45
+ end
46
+
47
+ specify "should have CGI headers on GET" do
48
+ GET("/test")
49
+ response["REQUEST_METHOD"].should.equal "GET"
50
+ response["SCRIPT_NAME"].should.equal "/test"
51
+ response["REQUEST_PATH"].should.equal "/test"
52
+ response["PATH_INFO"].should.be.nil
53
+ response["QUERY_STRING"].should.equal ""
54
+ response["test.postdata"].should.equal ""
55
+
56
+ GET("/test/foo?quux=1")
57
+ response["REQUEST_METHOD"].should.equal "GET"
58
+ response["SCRIPT_NAME"].should.equal "/test"
59
+ response["REQUEST_PATH"].should.equal "/test/foo"
60
+ response["PATH_INFO"].should.equal "/foo"
61
+ response["QUERY_STRING"].should.equal "quux=1"
62
+ end
63
+
64
+ specify "should have CGI headers on POST" do
65
+ POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'})
66
+ status.should.equal 200
67
+ response["REQUEST_METHOD"].should.equal "POST"
68
+ response["SCRIPT_NAME"].should.equal "/test"
69
+ response["REQUEST_PATH"].should.equal "/test"
70
+ response["QUERY_STRING"].should.equal ""
71
+ response["HTTP_X_TEST_HEADER"].should.equal "42"
72
+ response["test.postdata"].should.equal "rack-form-data=23"
73
+ end
74
+
75
+ specify "should support HTTP auth" do
76
+ GET("/test", {:user => "ruth", :passwd => "secret"})
77
+ response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ="
78
+ end
79
+
80
+ specify "should set status" do
81
+ GET("/test?secret")
82
+ status.should.equal 403
83
+ response["rack.url_scheme"].should.equal "http"
84
+ end
85
+
86
+ specify "should provide a .run" do
87
+ block_ran = false
88
+ Thread.new {
89
+ Rack::Handler::Mongrel.run(lambda {}, {:Port => 9211}) { |server|
90
+ server.should.be.kind_of Mongrel::HttpServer
91
+ block_ran = true
92
+ }
93
+ }
94
+ sleep 1
95
+ block_ran.should.be true
96
+ end
97
+
98
+ specify "should provide a .run that maps a hash" do
99
+ block_ran = false
100
+ Thread.new {
101
+ map = {'/'=>lambda{},'/foo'=>lambda{}}
102
+ Rack::Handler::Mongrel.run(map, :map => true, :Port => 9221) { |server|
103
+ server.should.be.kind_of Mongrel::HttpServer
104
+ server.classifier.uris.size.should.be 2
105
+ server.classifier.uris.should.not.include '/arf'
106
+ server.classifier.uris.should.include '/'
107
+ server.classifier.uris.should.include '/foo'
108
+ block_ran = true
109
+ }
110
+ }
111
+ sleep 1
112
+ block_ran.should.be true
113
+ end
114
+
115
+ specify "should provide a .run that maps a urlmap" do
116
+ block_ran = false
117
+ Thread.new {
118
+ map = Rack::URLMap.new({'/'=>lambda{},'/bar'=>lambda{}})
119
+ Rack::Handler::Mongrel.run(map, {:map => true, :Port => 9231}) { |server|
120
+ server.should.be.kind_of Mongrel::HttpServer
121
+ server.classifier.uris.size.should.be 2
122
+ server.classifier.uris.should.not.include '/arf'
123
+ server.classifier.uris.should.include '/'
124
+ server.classifier.uris.should.include '/bar'
125
+ block_ran = true
126
+ }
127
+ }
128
+ sleep 1
129
+ block_ran.should.be true
130
+ end
131
+
132
+ specify "should provide a .run that maps a urlmap restricting by host" do
133
+ block_ran = false
134
+ Thread.new {
135
+ map = Rack::URLMap.new({
136
+ '/' => lambda{},
137
+ '/foo' => lambda{},
138
+ '/bar' => lambda{},
139
+ 'http://localhost/' => lambda{},
140
+ 'http://localhost/bar' => lambda{},
141
+ 'http://falsehost/arf' => lambda{},
142
+ 'http://falsehost/qux' => lambda{}
143
+ })
144
+ opt = {:map => true, :Port => 9241, :Host => 'localhost'}
145
+ Rack::Handler::Mongrel.run(map, opt) { |server|
146
+ server.should.be.kind_of Mongrel::HttpServer
147
+ server.classifier.uris.should.include '/'
148
+ server.classifier.handler_map['/'].size.should.be 2
149
+ server.classifier.uris.should.include '/foo'
150
+ server.classifier.handler_map['/foo'].size.should.be 1
151
+ server.classifier.uris.should.include '/bar'
152
+ server.classifier.handler_map['/bar'].size.should.be 2
153
+ server.classifier.uris.should.not.include '/qux'
154
+ server.classifier.uris.should.not.include '/arf'
155
+ server.classifier.uris.size.should.be 3
156
+ block_ran = true
157
+ }
158
+ }
159
+ sleep 1
160
+ block_ran.should.be true
161
+ end
162
+
163
+ teardown do
164
+ @acc.raise Mongrel::StopServer
165
+ end
166
+ end
167
+
168
+ rescue LoadError
169
+ $stderr.puts "Skipping Rack::Handler::Mongrel tests (Mongrel is required). `gem install mongrel` and try again."
170
+ end
@@ -0,0 +1,77 @@
1
+ require 'test/spec'
2
+
3
+ require 'rack/recursive'
4
+ require 'rack/urlmap'
5
+ require 'rack/response'
6
+ require 'rack/mock'
7
+
8
+ context "Rack::Recursive" do
9
+ setup do
10
+
11
+ @app1 = lambda { |env|
12
+ res = Rack::Response.new
13
+ res["X-Path-Info"] = env["PATH_INFO"]
14
+ res["X-Query-String"] = env["QUERY_STRING"]
15
+ res.finish do |res|
16
+ res.write "App1"
17
+ end
18
+ }
19
+
20
+ @app2 = lambda { |env|
21
+ Rack::Response.new.finish do |res|
22
+ res.write "App2"
23
+ _, _, body = env['rack.recursive.include'].call(env, "/app1")
24
+ body.each { |b|
25
+ res.write b
26
+ }
27
+ end
28
+ }
29
+
30
+ @app3 = lambda { |env|
31
+ raise Rack::ForwardRequest.new("/app1")
32
+ }
33
+
34
+ @app4 = lambda { |env|
35
+ raise Rack::ForwardRequest.new("http://example.org/app1/quux?meh")
36
+ }
37
+
38
+ end
39
+
40
+ specify "should allow for subrequests" do
41
+ res = Rack::MockRequest.new(Rack::Recursive.new(
42
+ Rack::URLMap.new("/app1" => @app1,
43
+ "/app2" => @app2))).
44
+ get("/app2")
45
+
46
+ res.should.be.ok
47
+ res.body.should.equal "App2App1"
48
+ end
49
+
50
+ specify "should raise error on requests not below the app" do
51
+ app = Rack::URLMap.new("/app1" => @app1,
52
+ "/app" => Rack::Recursive.new(
53
+ Rack::URLMap.new("/1" => @app1,
54
+ "/2" => @app2)))
55
+
56
+ lambda {
57
+ Rack::MockRequest.new(app).get("/app/2")
58
+ }.should.raise(ArgumentError).
59
+ message.should =~ /can only include below/
60
+ end
61
+
62
+ specify "should support forwarding" do
63
+ app = Rack::Recursive.new(Rack::URLMap.new("/app1" => @app1,
64
+ "/app3" => @app3,
65
+ "/app4" => @app4))
66
+
67
+ res = Rack::MockRequest.new(app).get("/app3")
68
+ res.should.be.ok
69
+ res.body.should.equal "App1"
70
+
71
+ res = Rack::MockRequest.new(app).get("/app4")
72
+ res.should.be.ok
73
+ res.body.should.equal "App1"
74
+ res["X-Path-Info"].should.equal "/quux"
75
+ res["X-Query-String"].should.equal "meh"
76
+ end
77
+ end