renee 0.3.11 → 0.4.0.pre1
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.
- data/Gemfile +17 -0
- data/Gemfile-renee +8 -0
- data/Gemfile-renee-core +8 -0
- data/Gemfile-renee-render +9 -0
- data/Gemfile-renee-session +9 -0
- data/Gemfile-renee-url-generation +8 -0
- data/MIT-LICENSE.txt +7 -0
- data/README-renee-core.md +242 -0
- data/README-renee-render.md +38 -0
- data/README-renee-session.md +3 -0
- data/README-renee-url-generation.md +3 -0
- data/README.md +131 -6
- data/Rakefile +109 -9
- data/TODO.txt +45 -0
- data/config.ru +26 -0
- data/examples/blog/blog.rb +3 -1
- data/examples/blog/config.ru +24 -19
- data/examples/blog/views/edit.erb +10 -1
- data/examples/blog/views/show.erb +5 -0
- data/lib/renee.rb +11 -4
- data/lib/renee/core.rb +98 -0
- data/lib/renee/core/chaining.rb +66 -0
- data/lib/renee/core/env_accessors.rb +72 -0
- data/lib/renee/core/exceptions.rb +15 -0
- data/lib/renee/core/matcher.rb +61 -0
- data/lib/renee/core/plugins.rb +31 -0
- data/lib/renee/core/rack_interaction.rb +50 -0
- data/lib/renee/core/request_context.rb +56 -0
- data/lib/renee/core/responding.rb +112 -0
- data/lib/renee/core/response.rb +78 -0
- data/lib/renee/core/routing.rb +319 -0
- data/lib/renee/core/transform.rb +18 -0
- data/lib/renee/render.rb +221 -0
- data/lib/renee/session.rb +50 -0
- data/lib/renee/url_generation.rb +117 -0
- data/lib/renee/util.rb +7 -0
- data/lib/renee/version.rb +2 -4
- data/plan.txt +19 -0
- data/renee-core.gemspec +26 -0
- data/renee-render.gemspec +30 -0
- data/renee-session.gemspec +28 -0
- data/renee-url-generation.gemspec +24 -0
- data/renee.gemspec +5 -6
- data/site/MIT-LICENSE.txt +7 -0
- data/site/public/css/app.css +75 -0
- data/site/public/docs/renee-core/Renee.html +208 -0
- data/site/public/docs/renee-core/Renee/Core.html +366 -0
- data/site/public/docs/renee-core/Renee/Core/Chaining.html +192 -0
- data/site/public/docs/renee-core/Renee/Core/ClassMethods.html +725 -0
- data/site/public/docs/renee-core/Renee/Core/ClientError.html +317 -0
- data/site/public/docs/renee-core/Renee/Core/EnvAccessors.html +152 -0
- data/site/public/docs/renee-core/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
- data/site/public/docs/renee-core/Renee/Core/Matcher.html +675 -0
- data/site/public/docs/renee-core/Renee/Core/Plugins.html +475 -0
- data/site/public/docs/renee-core/Renee/Core/RackInteraction.html +488 -0
- data/site/public/docs/renee-core/Renee/Core/RequestContext.html +511 -0
- data/site/public/docs/renee-core/Renee/Core/Responding.html +877 -0
- data/site/public/docs/renee-core/Renee/Core/Response.html +691 -0
- data/site/public/docs/renee-core/Renee/Core/Routing.html +1589 -0
- data/site/public/docs/renee-core/Renee/Core/Transform.html +249 -0
- data/site/public/docs/renee-core/Renee/Core/URLGeneration.html +597 -0
- data/site/public/docs/renee-core/_index.html +244 -0
- data/site/public/docs/renee-core/class_list.html +47 -0
- data/site/public/docs/renee-core/css/common.css +1 -0
- data/site/public/docs/renee-core/css/full_list.css +55 -0
- data/site/public/docs/renee-core/css/style.css +322 -0
- data/site/public/docs/renee-core/file.README-renee-core.html +341 -0
- data/site/public/docs/renee-core/file.README.html +212 -0
- data/site/public/docs/renee-core/file_list.html +49 -0
- data/site/public/docs/renee-core/frames.html +13 -0
- data/site/public/docs/renee-core/index.html +341 -0
- data/site/public/docs/renee-core/js/app.js +205 -0
- data/site/public/docs/renee-core/js/full_list.js +167 -0
- data/site/public/docs/renee-core/js/jquery.js +16 -0
- data/site/public/docs/renee-core/method_list.html +590 -0
- data/site/public/docs/renee-core/top-level-namespace.html +103 -0
- data/site/public/docs/renee-render/Renee.html +116 -0
- data/site/public/docs/renee-render/Renee/Core.html +346 -0
- data/site/public/docs/renee-render/Renee/Core/Chaining.html +125 -0
- data/site/public/docs/renee-render/Renee/Core/ClassMethods.html +620 -0
- data/site/public/docs/renee-render/Renee/Core/ClientError.html +317 -0
- data/site/public/docs/renee-render/Renee/Core/EnvAccessors.html +152 -0
- data/site/public/docs/renee-render/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
- data/site/public/docs/renee-render/Renee/Core/Matcher.html +675 -0
- data/site/public/docs/renee-render/Renee/Core/RackInteraction.html +488 -0
- data/site/public/docs/renee-render/Renee/Core/RequestContext.html +421 -0
- data/site/public/docs/renee-render/Renee/Core/Responding.html +873 -0
- data/site/public/docs/renee-render/Renee/Core/Response.html +691 -0
- data/site/public/docs/renee-render/Renee/Core/Routing.html +1682 -0
- data/site/public/docs/renee-render/Renee/Core/Transform.html +249 -0
- data/site/public/docs/renee-render/Renee/Core/URLGeneration.html +597 -0
- data/site/public/docs/renee-render/Renee/Render.html +873 -0
- data/site/public/docs/renee-render/Renee/Render/ClassMethods.html +382 -0
- data/site/public/docs/renee-render/Renee/Render/TemplateNotFound.html +126 -0
- data/site/public/docs/renee-render/_index.html +143 -0
- data/site/public/docs/renee-render/class_list.html +47 -0
- data/site/public/docs/renee-render/css/common.css +1 -0
- data/site/public/docs/renee-render/css/full_list.css +55 -0
- data/site/public/docs/renee-render/css/style.css +322 -0
- data/site/public/docs/renee-render/file.README-renee-render.html +104 -0
- data/site/public/docs/renee-render/file.README.html +212 -0
- data/site/public/docs/renee-render/file_list.html +49 -0
- data/site/public/docs/renee-render/frames.html +13 -0
- data/site/public/docs/renee-render/index.html +104 -0
- data/site/public/docs/renee-render/js/app.js +205 -0
- data/site/public/docs/renee-render/js/full_list.js +167 -0
- data/site/public/docs/renee-render/js/jquery.js +16 -0
- data/site/public/docs/renee-render/method_list.html +110 -0
- data/site/public/docs/renee-render/top-level-namespace.html +103 -0
- data/site/public/docs/renee-session/Renee.html +106 -0
- data/site/public/docs/renee-session/Renee/Session.html +173 -0
- data/site/public/docs/renee-session/Renee/Session/ClassMethods.html +470 -0
- data/site/public/docs/renee-session/_index.html +136 -0
- data/site/public/docs/renee-session/class_list.html +47 -0
- data/site/public/docs/renee-session/css/common.css +1 -0
- data/site/public/docs/renee-session/css/full_list.css +55 -0
- data/site/public/docs/renee-session/css/style.css +322 -0
- data/site/public/docs/renee-session/file.README-renee-core.html +341 -0
- data/site/public/docs/renee-session/file.README-renee-session.html +69 -0
- data/site/public/docs/renee-session/file_list.html +49 -0
- data/site/public/docs/renee-session/frames.html +13 -0
- data/site/public/docs/renee-session/index.html +69 -0
- data/site/public/docs/renee-session/js/app.js +205 -0
- data/site/public/docs/renee-session/js/full_list.js +167 -0
- data/site/public/docs/renee-session/js/jquery.js +16 -0
- data/site/public/docs/renee-session/method_list.html +102 -0
- data/site/public/docs/renee-session/top-level-namespace.html +103 -0
- data/site/public/docs/renee-url-generation/Renee.html +208 -0
- data/site/public/docs/renee-url-generation/Renee/Core.html +366 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Chaining.html +192 -0
- data/site/public/docs/renee-url-generation/Renee/Core/ClassMethods.html +725 -0
- data/site/public/docs/renee-url-generation/Renee/Core/ClientError.html +317 -0
- data/site/public/docs/renee-url-generation/Renee/Core/EnvAccessors.html +152 -0
- data/site/public/docs/renee-url-generation/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Matcher.html +675 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Plugins.html +475 -0
- data/site/public/docs/renee-url-generation/Renee/Core/RackInteraction.html +488 -0
- data/site/public/docs/renee-url-generation/Renee/Core/RequestContext.html +511 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Responding.html +877 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Response.html +691 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Routing.html +1589 -0
- data/site/public/docs/renee-url-generation/Renee/Core/Transform.html +249 -0
- data/site/public/docs/renee-url-generation/_index.html +244 -0
- data/site/public/docs/renee-url-generation/class_list.html +47 -0
- data/site/public/docs/renee-url-generation/css/common.css +1 -0
- data/site/public/docs/renee-url-generation/css/full_list.css +55 -0
- data/site/public/docs/renee-url-generation/css/style.css +322 -0
- data/site/public/docs/renee-url-generation/file.README-renee-url-generation.html +69 -0
- data/site/public/docs/renee-url-generation/file_list.html +49 -0
- data/site/public/docs/renee-url-generation/frames.html +13 -0
- data/site/public/docs/renee-url-generation/index.html +69 -0
- data/site/public/docs/renee-url-generation/js/app.js +205 -0
- data/site/public/docs/renee-url-generation/js/full_list.js +167 -0
- data/site/public/docs/renee-url-generation/js/jquery.js +16 -0
- data/site/public/docs/renee-url-generation/method_list.html +590 -0
- data/site/public/docs/renee-url-generation/top-level-namespace.html +103 -0
- data/site/public/docs/renee/Renee.html +232 -0
- data/site/public/docs/renee/Renee/Application.html +367 -0
- data/site/public/docs/renee/Renee/Core.html +370 -0
- data/site/public/docs/renee/Renee/Core/Chaining.html +192 -0
- data/site/public/docs/renee/Renee/Core/ClassMethods.html +725 -0
- data/site/public/docs/renee/Renee/Core/ClientError.html +317 -0
- data/site/public/docs/renee/Renee/Core/EnvAccessors.html +152 -0
- data/site/public/docs/renee/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
- data/site/public/docs/renee/Renee/Core/Matcher.html +675 -0
- data/site/public/docs/renee/Renee/Core/Plugins.html +475 -0
- data/site/public/docs/renee/Renee/Core/RackInteraction.html +488 -0
- data/site/public/docs/renee/Renee/Core/RequestContext.html +511 -0
- data/site/public/docs/renee/Renee/Core/Responding.html +877 -0
- data/site/public/docs/renee/Renee/Core/Response.html +691 -0
- data/site/public/docs/renee/Renee/Core/Routing.html +1589 -0
- data/site/public/docs/renee/Renee/Core/Transform.html +249 -0
- data/site/public/docs/renee/Renee/Core/URLGeneration.html +597 -0
- data/site/public/docs/renee/Renee/Render.html +877 -0
- data/site/public/docs/renee/Renee/Render/ClassMethods.html +382 -0
- data/site/public/docs/renee/Renee/Render/TemplateNotFound.html +126 -0
- data/site/public/docs/renee/Renee/Session.html +177 -0
- data/site/public/docs/renee/Renee/Session/ClassMethods.html +470 -0
- data/site/public/docs/renee/Renee/URLGeneration.html +142 -0
- data/site/public/docs/renee/Renee/URLGeneration/ClassMethods.html +593 -0
- data/site/public/docs/renee/Renee/Util.html +163 -0
- data/site/public/docs/renee/_index.html +336 -0
- data/site/public/docs/renee/class_list.html +47 -0
- data/site/public/docs/renee/css/common.css +1 -0
- data/site/public/docs/renee/css/full_list.css +55 -0
- data/site/public/docs/renee/css/style.css +322 -0
- data/site/public/docs/renee/file.README.html +212 -0
- data/site/public/docs/renee/file_list.html +49 -0
- data/site/public/docs/renee/frames.html +13 -0
- data/site/public/docs/renee/index.html +212 -0
- data/site/public/docs/renee/js/app.js +205 -0
- data/site/public/docs/renee/js/full_list.js +167 -0
- data/site/public/docs/renee/js/jquery.js +16 -0
- data/site/public/docs/renee/method_list.html +758 -0
- data/site/public/docs/renee/top-level-namespace.html +202 -0
- data/site/public/img/favicon.ico +0 -0
- data/site/public/img/reneeclean.png +0 -0
- data/site/public/img/russiangithub.png +0 -0
- data/site/public/img/stoneposter.png +0 -0
- data/site/public/img/vospit.jpeg +0 -0
- data/site/views/chaining.md +32 -0
- data/site/views/index.md +219 -0
- data/site/views/layouts/app.haml +16 -0
- data/site/views/rack-integration.md +51 -0
- data/site/views/responding.md +103 -0
- data/site/views/route-generation.md +82 -0
- data/site/views/routing.md +261 -0
- data/site/views/settings.md +19 -0
- data/site/views/team-renee.md +13 -0
- data/site/views/tutorial.md +57 -0
- data/site/views/variable-types.md +57 -0
- data/test.watchr +61 -0
- data/test/renee-core/chaining_test.rb +33 -0
- data/test/renee-core/env_accessors_test.rb +43 -0
- data/test/renee-core/include_test.rb +14 -0
- data/test/renee-core/request_context_test.rb +70 -0
- data/test/renee-core/responding_test.rb +128 -0
- data/test/renee-core/routing_test.rb +443 -0
- data/test/renee-core/test_helper.rb +4 -0
- data/test/renee-core/variable_type_test.rb +57 -0
- data/test/renee-render/render_test.rb +162 -0
- data/test/renee-render/test_helper.rb +9 -0
- data/test/renee-session/session_test.rb +31 -0
- data/test/renee-session/test_helper.rb +9 -0
- data/test/renee-url-generation/test_helper.rb +10 -0
- data/test/renee-url-generation/url_generation_test.rb +63 -0
- data/test/{blog_test.rb → renee/blog_test.rb} +10 -5
- data/test/renee/test_helper.rb +56 -0
- data/test/test_helper.rb +23 -10
- metadata +333 -156
- data/.yardopts +0 -6
@@ -0,0 +1,443 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
describe Renee::Core::Routing do
|
4
|
+
|
5
|
+
def renee_for(path, options = {}, &block)
|
6
|
+
Renee.core(&block).call(Rack::MockRequest.env_for(path, options))
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "with paths" do
|
10
|
+
it "generates a basic route" do
|
11
|
+
type = { 'Content-Type' => 'text/plain' }
|
12
|
+
mock_app do
|
13
|
+
path('/') { get { halt [200,type,['foo']] } }
|
14
|
+
path('bar') { put { halt [200,type,['bar']] } }
|
15
|
+
|
16
|
+
path '/foo' do
|
17
|
+
delete { halt [200,type,['hi']] }
|
18
|
+
|
19
|
+
path '/bar/har' do
|
20
|
+
get { halt [200,type,['foobar']] }
|
21
|
+
post { halt [200,type,['posted']] }
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
get '/'
|
27
|
+
assert_equal 200, response.status
|
28
|
+
assert_equal 'foo', response.body
|
29
|
+
put '/bar'
|
30
|
+
assert_equal 200, response.status
|
31
|
+
assert_equal 'bar', response.body
|
32
|
+
delete '/foo'
|
33
|
+
assert_equal 200, response.status
|
34
|
+
assert_equal 'hi', response.body
|
35
|
+
get '/foo/bar/har'
|
36
|
+
assert_equal 200, response.status
|
37
|
+
assert_equal 'foobar', response.body
|
38
|
+
post '/foo/bar/har'
|
39
|
+
assert_equal 200, response.status
|
40
|
+
assert_equal 'posted', response.body
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "with trailing slashes" do
|
44
|
+
it "should ignore trailing slashes normally" do
|
45
|
+
type = { 'Content-Type' => 'text/plain' }
|
46
|
+
mock_app do
|
47
|
+
path('test') { get { halt [200,type,['test']] } }
|
48
|
+
end
|
49
|
+
|
50
|
+
get '/test/'
|
51
|
+
assert_equal 200, response.status
|
52
|
+
assert_equal 'test', response.body
|
53
|
+
get '/test'
|
54
|
+
assert_equal 200, response.status
|
55
|
+
assert_equal 'test', response.body
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should not ignore trailing slashes if told not to" do
|
59
|
+
type = { 'Content-Type' => 'text/plain' }
|
60
|
+
mock_app do
|
61
|
+
path('test').empty { get { halt [200,type,['test']] } }
|
62
|
+
end
|
63
|
+
get '/test/'
|
64
|
+
assert_equal 404, response.status
|
65
|
+
get '/test'
|
66
|
+
assert_equal 200, response.status
|
67
|
+
assert_equal 'test', response.body
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "with variables" do
|
73
|
+
|
74
|
+
it "generates for path" do
|
75
|
+
type = { 'Content-Type' => 'text/plain' }
|
76
|
+
mock_app do
|
77
|
+
path 'test' do
|
78
|
+
variable do |id|
|
79
|
+
get { halt [200,type,[id]] }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
path 'two' do
|
84
|
+
var.var do |foo, bar|
|
85
|
+
get { halt [200, type,["#{foo}-#{bar}"]] }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
path 'multi' do
|
90
|
+
multi_var(3) do |foo, bar, lol|
|
91
|
+
post { halt [200, type,["#{foo}-#{bar}-#{lol}"]] }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
get '/test/hello'
|
97
|
+
assert_equal 200, response.status
|
98
|
+
assert_equal 'hello', response.body
|
99
|
+
get '/two/1/2'
|
100
|
+
assert_equal 200, response.status
|
101
|
+
assert_equal '1-2', response.body
|
102
|
+
post '/multi/1/2/3'
|
103
|
+
assert_equal 200, response.status
|
104
|
+
assert_equal '1-2-3', response.body
|
105
|
+
end
|
106
|
+
|
107
|
+
it "generates nested paths" do
|
108
|
+
type = { 'Content-Type' => 'text/plain' }
|
109
|
+
mock_app do
|
110
|
+
path 'test' do
|
111
|
+
var do |id|
|
112
|
+
path 'moar' do
|
113
|
+
post { halt [200, type, [id]] }
|
114
|
+
end
|
115
|
+
|
116
|
+
path 'more' do
|
117
|
+
var.var do |foo, bar|
|
118
|
+
get { halt [200, type, ["#{foo}-#{bar}"]] }
|
119
|
+
|
120
|
+
path 'woo' do
|
121
|
+
get { halt [200, type, ["#{foo}-#{bar}-woo"]] }
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
post '/test/world/moar'
|
130
|
+
assert_equal 200, response.status
|
131
|
+
assert_equal 'world', response.body
|
132
|
+
get '/test/world/more/1/2'
|
133
|
+
assert_equal 200, response.status
|
134
|
+
assert_equal '1-2', response.body
|
135
|
+
get '/test/world/more/1/2/woo'
|
136
|
+
assert_equal 200, response.status
|
137
|
+
assert_equal '1-2-woo', response.body
|
138
|
+
end
|
139
|
+
|
140
|
+
it "accepts an typcasts integers" do
|
141
|
+
type = { 'Content-Type' => 'text/plain' }
|
142
|
+
mock_app do
|
143
|
+
path 'add' do
|
144
|
+
var(:integer).var(:integer) do |a, b|
|
145
|
+
halt [200, type, ["#{a + b}"]]
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
get '/add/3/4'
|
151
|
+
assert_equal 200, response.status
|
152
|
+
assert_equal '7', response.body
|
153
|
+
end
|
154
|
+
|
155
|
+
it "can take an optional variable" do
|
156
|
+
type = { 'Content-Type' => 'text/plain' }
|
157
|
+
mock_app do
|
158
|
+
path 'add' do
|
159
|
+
var(:integer).optional(:integer) do |a, b|
|
160
|
+
b ||= a
|
161
|
+
halt [200, type, ["#{a + b}"]]
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
get '/add/3/4'
|
167
|
+
assert_equal 200, response.status
|
168
|
+
assert_equal '7', response.body
|
169
|
+
get '/add/3'
|
170
|
+
assert_equal 200, response.status
|
171
|
+
assert_equal '6', response.body
|
172
|
+
end
|
173
|
+
|
174
|
+
it "allows arbitrary ranges of values" do
|
175
|
+
type = { 'Content-Type' => 'text/plain' }
|
176
|
+
mock_app do
|
177
|
+
path 'add' do
|
178
|
+
multi_var(2..5, :integer).get do |numbers|
|
179
|
+
halt [200, type, ["Add up to #{numbers.inject(numbers.shift) {|m, i| m += i}}"]]
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
get '/add/3/4'
|
185
|
+
assert_equal 200, response.status
|
186
|
+
assert_equal 'Add up to 7', response.body
|
187
|
+
get '/add/3/4/6/7'
|
188
|
+
assert_equal 200, response.status
|
189
|
+
assert_equal 'Add up to 20', response.body
|
190
|
+
get '/add/3/4/6/7/8/10/2'
|
191
|
+
assert_equal 404, response.status
|
192
|
+
end
|
193
|
+
|
194
|
+
it "accepts allows repeating vars" do
|
195
|
+
type = { 'Content-Type' => 'text/plain' }
|
196
|
+
mock_app do
|
197
|
+
path 'add' do
|
198
|
+
glob :integer do |numbers|
|
199
|
+
halt [200, type, ["Add up to #{numbers.inject(numbers.shift) {|m, i| m += i}}"]]
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
get '/add/3/4'
|
205
|
+
assert_equal 200, response.status
|
206
|
+
assert_equal 'Add up to 7', response.body
|
207
|
+
get '/add/3/4/6/7'
|
208
|
+
assert_equal 200, response.status
|
209
|
+
assert_equal 'Add up to 20', response.body
|
210
|
+
end
|
211
|
+
|
212
|
+
it "accepts a regexp" do
|
213
|
+
type = { 'Content-Type' => 'text/plain' }
|
214
|
+
mock_app do
|
215
|
+
path 'add' do
|
216
|
+
var(/foo|bar/).var(/foo|bar/) do |a, b|
|
217
|
+
halt [200, type, ["#{a + b}"]]
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
get '/add/bar/foo'
|
223
|
+
assert_equal 200, response.status
|
224
|
+
assert_equal 'barfoo', response.body
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
describe "with remainder" do
|
229
|
+
|
230
|
+
it "matches the rest of the routes" do
|
231
|
+
type = { 'Content-Type' => 'text/plain' }
|
232
|
+
mock_app do
|
233
|
+
path 'test' do
|
234
|
+
get { halt [200,type,['test']] }
|
235
|
+
|
236
|
+
remainder do |rest|
|
237
|
+
post { halt [200, type, ["test-#{rest}"]] }
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
remainder do |rest|
|
242
|
+
halt [200, type, [rest]]
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
get '/a/b/c'
|
247
|
+
assert_equal 200, response.status
|
248
|
+
assert_equal '/a/b/c', response.body
|
249
|
+
post '/test/world/moar'
|
250
|
+
assert_equal 200, response.status
|
251
|
+
assert_equal 'test-/world/moar', response.body
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
describe "with extensions" do
|
256
|
+
it "should match an extension" do
|
257
|
+
type = { 'Content-Type' => 'text/plain' }
|
258
|
+
mock_app do
|
259
|
+
path('/test').get do
|
260
|
+
case extension
|
261
|
+
when 'html' then halt [200, type, ['test html']]
|
262
|
+
when 'json' then halt [200, type, ['test json']]
|
263
|
+
when nil then halt [200, type, ['test nope']]
|
264
|
+
else halt [406, type, ['unknown']]
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
extension 'html' do
|
269
|
+
halt [200, type, ['test html']]
|
270
|
+
end
|
271
|
+
end
|
272
|
+
get '/test.html'
|
273
|
+
assert_equal 200, response.status
|
274
|
+
assert_equal 'test html', response.body
|
275
|
+
get '/test.json'
|
276
|
+
assert_equal 200, response.status
|
277
|
+
assert_equal 'test json', response.body
|
278
|
+
get '/test.xml'
|
279
|
+
assert_equal 406, response.status
|
280
|
+
end
|
281
|
+
|
282
|
+
it "should match an extension when there is a non-specific variable before" do
|
283
|
+
mock_app do
|
284
|
+
var do |id|
|
285
|
+
case extension
|
286
|
+
when 'html' then halt "html #{id}"
|
287
|
+
when 'xml' then halt "xml #{id}"
|
288
|
+
when nil then halt "none #{id}"
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|
292
|
+
get '/var.html'
|
293
|
+
assert_equal 200, response.status
|
294
|
+
assert_equal 'html var', response.body
|
295
|
+
get '/var.xml'
|
296
|
+
assert_equal 200, response.status
|
297
|
+
assert_equal 'xml var', response.body
|
298
|
+
get '/var'
|
299
|
+
assert_equal 200, response.status
|
300
|
+
assert_equal 'none var', response.body
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
describe "with part and part_var" do
|
305
|
+
it "should match a part" do
|
306
|
+
mock_app do
|
307
|
+
part '/test' do
|
308
|
+
part 'more' do
|
309
|
+
halt :ok
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
313
|
+
get '/testmore'
|
314
|
+
assert_equal 200, response.status
|
315
|
+
end
|
316
|
+
|
317
|
+
it "should match a part_var" do
|
318
|
+
mock_app do
|
319
|
+
part '/test' do
|
320
|
+
part 'more' do
|
321
|
+
part_var do |var|
|
322
|
+
path 'test' do
|
323
|
+
halt var
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
get '/testmorethisvar/test'
|
330
|
+
assert_equal 'thisvar', response.body
|
331
|
+
end
|
332
|
+
|
333
|
+
it "should match a part_var with Integer" do
|
334
|
+
mock_app do
|
335
|
+
part '/test' do
|
336
|
+
part 'more' do
|
337
|
+
part_var :integer do |var|
|
338
|
+
path 'test' do
|
339
|
+
halt var.to_s
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
end
|
344
|
+
end
|
345
|
+
get '/testmore123/test'
|
346
|
+
assert_equal '123', response.body
|
347
|
+
get '/testmore123a/test'
|
348
|
+
assert_equal 404, response.status
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
describe "multiple Renee's" do
|
353
|
+
it "should pass between them normally" do
|
354
|
+
type = { 'Content-Type' => 'text/plain' }
|
355
|
+
mock_app do
|
356
|
+
path 'test' do
|
357
|
+
halt run Renee.core {
|
358
|
+
path 'time' do
|
359
|
+
halt halt [200,type,['test']]
|
360
|
+
end
|
361
|
+
}
|
362
|
+
end
|
363
|
+
end
|
364
|
+
get '/test/time'
|
365
|
+
assert_equal 200, response.status
|
366
|
+
assert_equal 'test', response.body
|
367
|
+
end
|
368
|
+
|
369
|
+
it "should support run! passing between" do
|
370
|
+
type = { 'Content-Type' => 'text/plain' }
|
371
|
+
mock_app do
|
372
|
+
path 'test' do
|
373
|
+
run! Renee.core {
|
374
|
+
path 'time' do
|
375
|
+
halt halt [200,type,['test']]
|
376
|
+
end
|
377
|
+
}
|
378
|
+
end
|
379
|
+
end
|
380
|
+
get '/test/time'
|
381
|
+
assert_equal 200, response.status
|
382
|
+
assert_equal 'test', response.body
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
describe "#build" do
|
387
|
+
it "should allow building in-place rack apps" do
|
388
|
+
type = { 'Content-Type' => 'text/plain' }
|
389
|
+
mock_app do
|
390
|
+
path('test') do
|
391
|
+
halt build {
|
392
|
+
run proc {|env| [200, type, ['someone built me!']] }
|
393
|
+
}
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
get '/test'
|
398
|
+
assert_equal 200, response.status
|
399
|
+
assert_equal 'someone built me!', response.body
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
describe "#part and #part_var" do
|
404
|
+
it "should match parts and partial vars" do
|
405
|
+
mock_app do
|
406
|
+
part('test') {
|
407
|
+
part_var(:integer) { |id|
|
408
|
+
part('more') {
|
409
|
+
halt "the id is #{id}"
|
410
|
+
}
|
411
|
+
}
|
412
|
+
}
|
413
|
+
end
|
414
|
+
get '/test123more'
|
415
|
+
assert_equal 200, response.status
|
416
|
+
assert_equal 'the id is 123', response.body
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
describe "request methods" do
|
421
|
+
it "should allow request method routing when you're matching on /" do
|
422
|
+
type = { 'Content-Type' => 'text/plain' }
|
423
|
+
mock_app do
|
424
|
+
get { halt [200, type, ["hiya"]] }
|
425
|
+
end
|
426
|
+
|
427
|
+
get '/'
|
428
|
+
assert_equal 200, response.status
|
429
|
+
assert_equal 'hiya', response.body
|
430
|
+
end
|
431
|
+
|
432
|
+
it "should raise if you fail to halt" do
|
433
|
+
type = { 'Content-Type' => 'text/plain' }
|
434
|
+
mock_app do
|
435
|
+
get { }
|
436
|
+
halt :ok
|
437
|
+
end
|
438
|
+
|
439
|
+
get '/'
|
440
|
+
assert_equal 404, response.status
|
441
|
+
end
|
442
|
+
end
|
443
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
describe Renee::Core::Matcher do
|
4
|
+
it "should transform variables" do
|
5
|
+
mock_app {
|
6
|
+
var :symbol do |i|
|
7
|
+
halt i.inspect
|
8
|
+
end
|
9
|
+
}.setup {
|
10
|
+
register_variable_type(:symbol, /[a-z_]+/).on_transform{|v| v.to_sym}
|
11
|
+
}
|
12
|
+
get '/test'
|
13
|
+
assert_equal ":test", response.body
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should halt on errors if told to" do
|
17
|
+
mock_app {
|
18
|
+
var :symbol do |i|
|
19
|
+
halt i.inspect
|
20
|
+
end
|
21
|
+
}.setup {
|
22
|
+
register_variable_type(:symbol, /[a-z_]+/).on_transform{|v| v.to_sym}.raise_on_error!
|
23
|
+
}
|
24
|
+
get '/123'
|
25
|
+
assert_equal 400, response.status
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should allow custom error handling behaviour on values that don't match" do
|
29
|
+
mock_app {
|
30
|
+
var :symbol do |i|
|
31
|
+
halt i.inspect
|
32
|
+
end
|
33
|
+
}.setup {
|
34
|
+
register_variable_type(:symbol, /[a-z_]+/).on_transform{|v| v.to_sym}.on_error{|v| halt 500 }
|
35
|
+
}
|
36
|
+
get '/123'
|
37
|
+
assert_equal 500, response.status
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should allow composite variable types" do
|
41
|
+
mock_app {
|
42
|
+
path("plus10").var(:int_or_hex) do |i|
|
43
|
+
halt "plus10: #{i + 10}"
|
44
|
+
end
|
45
|
+
}.setup {
|
46
|
+
register_variable_type(:int, /[0-9]+/).on_transform{|v| Integer(v)}
|
47
|
+
register_variable_type(:hex, /0x[0-9a-f]+/).on_transform{|v| v.to_i(16)}
|
48
|
+
register_variable_type(:int_or_hex, [:hex, :int])
|
49
|
+
}
|
50
|
+
get '/plus10/123'
|
51
|
+
assert_equal 'plus10: 133', response.body
|
52
|
+
get '/plus10/0x7b'
|
53
|
+
assert_equal 'plus10: 133', response.body
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|