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.
Files changed (231) hide show
  1. data/Gemfile +17 -0
  2. data/Gemfile-renee +8 -0
  3. data/Gemfile-renee-core +8 -0
  4. data/Gemfile-renee-render +9 -0
  5. data/Gemfile-renee-session +9 -0
  6. data/Gemfile-renee-url-generation +8 -0
  7. data/MIT-LICENSE.txt +7 -0
  8. data/README-renee-core.md +242 -0
  9. data/README-renee-render.md +38 -0
  10. data/README-renee-session.md +3 -0
  11. data/README-renee-url-generation.md +3 -0
  12. data/README.md +131 -6
  13. data/Rakefile +109 -9
  14. data/TODO.txt +45 -0
  15. data/config.ru +26 -0
  16. data/examples/blog/blog.rb +3 -1
  17. data/examples/blog/config.ru +24 -19
  18. data/examples/blog/views/edit.erb +10 -1
  19. data/examples/blog/views/show.erb +5 -0
  20. data/lib/renee.rb +11 -4
  21. data/lib/renee/core.rb +98 -0
  22. data/lib/renee/core/chaining.rb +66 -0
  23. data/lib/renee/core/env_accessors.rb +72 -0
  24. data/lib/renee/core/exceptions.rb +15 -0
  25. data/lib/renee/core/matcher.rb +61 -0
  26. data/lib/renee/core/plugins.rb +31 -0
  27. data/lib/renee/core/rack_interaction.rb +50 -0
  28. data/lib/renee/core/request_context.rb +56 -0
  29. data/lib/renee/core/responding.rb +112 -0
  30. data/lib/renee/core/response.rb +78 -0
  31. data/lib/renee/core/routing.rb +319 -0
  32. data/lib/renee/core/transform.rb +18 -0
  33. data/lib/renee/render.rb +221 -0
  34. data/lib/renee/session.rb +50 -0
  35. data/lib/renee/url_generation.rb +117 -0
  36. data/lib/renee/util.rb +7 -0
  37. data/lib/renee/version.rb +2 -4
  38. data/plan.txt +19 -0
  39. data/renee-core.gemspec +26 -0
  40. data/renee-render.gemspec +30 -0
  41. data/renee-session.gemspec +28 -0
  42. data/renee-url-generation.gemspec +24 -0
  43. data/renee.gemspec +5 -6
  44. data/site/MIT-LICENSE.txt +7 -0
  45. data/site/public/css/app.css +75 -0
  46. data/site/public/docs/renee-core/Renee.html +208 -0
  47. data/site/public/docs/renee-core/Renee/Core.html +366 -0
  48. data/site/public/docs/renee-core/Renee/Core/Chaining.html +192 -0
  49. data/site/public/docs/renee-core/Renee/Core/ClassMethods.html +725 -0
  50. data/site/public/docs/renee-core/Renee/Core/ClientError.html +317 -0
  51. data/site/public/docs/renee-core/Renee/Core/EnvAccessors.html +152 -0
  52. data/site/public/docs/renee-core/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
  53. data/site/public/docs/renee-core/Renee/Core/Matcher.html +675 -0
  54. data/site/public/docs/renee-core/Renee/Core/Plugins.html +475 -0
  55. data/site/public/docs/renee-core/Renee/Core/RackInteraction.html +488 -0
  56. data/site/public/docs/renee-core/Renee/Core/RequestContext.html +511 -0
  57. data/site/public/docs/renee-core/Renee/Core/Responding.html +877 -0
  58. data/site/public/docs/renee-core/Renee/Core/Response.html +691 -0
  59. data/site/public/docs/renee-core/Renee/Core/Routing.html +1589 -0
  60. data/site/public/docs/renee-core/Renee/Core/Transform.html +249 -0
  61. data/site/public/docs/renee-core/Renee/Core/URLGeneration.html +597 -0
  62. data/site/public/docs/renee-core/_index.html +244 -0
  63. data/site/public/docs/renee-core/class_list.html +47 -0
  64. data/site/public/docs/renee-core/css/common.css +1 -0
  65. data/site/public/docs/renee-core/css/full_list.css +55 -0
  66. data/site/public/docs/renee-core/css/style.css +322 -0
  67. data/site/public/docs/renee-core/file.README-renee-core.html +341 -0
  68. data/site/public/docs/renee-core/file.README.html +212 -0
  69. data/site/public/docs/renee-core/file_list.html +49 -0
  70. data/site/public/docs/renee-core/frames.html +13 -0
  71. data/site/public/docs/renee-core/index.html +341 -0
  72. data/site/public/docs/renee-core/js/app.js +205 -0
  73. data/site/public/docs/renee-core/js/full_list.js +167 -0
  74. data/site/public/docs/renee-core/js/jquery.js +16 -0
  75. data/site/public/docs/renee-core/method_list.html +590 -0
  76. data/site/public/docs/renee-core/top-level-namespace.html +103 -0
  77. data/site/public/docs/renee-render/Renee.html +116 -0
  78. data/site/public/docs/renee-render/Renee/Core.html +346 -0
  79. data/site/public/docs/renee-render/Renee/Core/Chaining.html +125 -0
  80. data/site/public/docs/renee-render/Renee/Core/ClassMethods.html +620 -0
  81. data/site/public/docs/renee-render/Renee/Core/ClientError.html +317 -0
  82. data/site/public/docs/renee-render/Renee/Core/EnvAccessors.html +152 -0
  83. data/site/public/docs/renee-render/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
  84. data/site/public/docs/renee-render/Renee/Core/Matcher.html +675 -0
  85. data/site/public/docs/renee-render/Renee/Core/RackInteraction.html +488 -0
  86. data/site/public/docs/renee-render/Renee/Core/RequestContext.html +421 -0
  87. data/site/public/docs/renee-render/Renee/Core/Responding.html +873 -0
  88. data/site/public/docs/renee-render/Renee/Core/Response.html +691 -0
  89. data/site/public/docs/renee-render/Renee/Core/Routing.html +1682 -0
  90. data/site/public/docs/renee-render/Renee/Core/Transform.html +249 -0
  91. data/site/public/docs/renee-render/Renee/Core/URLGeneration.html +597 -0
  92. data/site/public/docs/renee-render/Renee/Render.html +873 -0
  93. data/site/public/docs/renee-render/Renee/Render/ClassMethods.html +382 -0
  94. data/site/public/docs/renee-render/Renee/Render/TemplateNotFound.html +126 -0
  95. data/site/public/docs/renee-render/_index.html +143 -0
  96. data/site/public/docs/renee-render/class_list.html +47 -0
  97. data/site/public/docs/renee-render/css/common.css +1 -0
  98. data/site/public/docs/renee-render/css/full_list.css +55 -0
  99. data/site/public/docs/renee-render/css/style.css +322 -0
  100. data/site/public/docs/renee-render/file.README-renee-render.html +104 -0
  101. data/site/public/docs/renee-render/file.README.html +212 -0
  102. data/site/public/docs/renee-render/file_list.html +49 -0
  103. data/site/public/docs/renee-render/frames.html +13 -0
  104. data/site/public/docs/renee-render/index.html +104 -0
  105. data/site/public/docs/renee-render/js/app.js +205 -0
  106. data/site/public/docs/renee-render/js/full_list.js +167 -0
  107. data/site/public/docs/renee-render/js/jquery.js +16 -0
  108. data/site/public/docs/renee-render/method_list.html +110 -0
  109. data/site/public/docs/renee-render/top-level-namespace.html +103 -0
  110. data/site/public/docs/renee-session/Renee.html +106 -0
  111. data/site/public/docs/renee-session/Renee/Session.html +173 -0
  112. data/site/public/docs/renee-session/Renee/Session/ClassMethods.html +470 -0
  113. data/site/public/docs/renee-session/_index.html +136 -0
  114. data/site/public/docs/renee-session/class_list.html +47 -0
  115. data/site/public/docs/renee-session/css/common.css +1 -0
  116. data/site/public/docs/renee-session/css/full_list.css +55 -0
  117. data/site/public/docs/renee-session/css/style.css +322 -0
  118. data/site/public/docs/renee-session/file.README-renee-core.html +341 -0
  119. data/site/public/docs/renee-session/file.README-renee-session.html +69 -0
  120. data/site/public/docs/renee-session/file_list.html +49 -0
  121. data/site/public/docs/renee-session/frames.html +13 -0
  122. data/site/public/docs/renee-session/index.html +69 -0
  123. data/site/public/docs/renee-session/js/app.js +205 -0
  124. data/site/public/docs/renee-session/js/full_list.js +167 -0
  125. data/site/public/docs/renee-session/js/jquery.js +16 -0
  126. data/site/public/docs/renee-session/method_list.html +102 -0
  127. data/site/public/docs/renee-session/top-level-namespace.html +103 -0
  128. data/site/public/docs/renee-url-generation/Renee.html +208 -0
  129. data/site/public/docs/renee-url-generation/Renee/Core.html +366 -0
  130. data/site/public/docs/renee-url-generation/Renee/Core/Chaining.html +192 -0
  131. data/site/public/docs/renee-url-generation/Renee/Core/ClassMethods.html +725 -0
  132. data/site/public/docs/renee-url-generation/Renee/Core/ClientError.html +317 -0
  133. data/site/public/docs/renee-url-generation/Renee/Core/EnvAccessors.html +152 -0
  134. data/site/public/docs/renee-url-generation/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
  135. data/site/public/docs/renee-url-generation/Renee/Core/Matcher.html +675 -0
  136. data/site/public/docs/renee-url-generation/Renee/Core/Plugins.html +475 -0
  137. data/site/public/docs/renee-url-generation/Renee/Core/RackInteraction.html +488 -0
  138. data/site/public/docs/renee-url-generation/Renee/Core/RequestContext.html +511 -0
  139. data/site/public/docs/renee-url-generation/Renee/Core/Responding.html +877 -0
  140. data/site/public/docs/renee-url-generation/Renee/Core/Response.html +691 -0
  141. data/site/public/docs/renee-url-generation/Renee/Core/Routing.html +1589 -0
  142. data/site/public/docs/renee-url-generation/Renee/Core/Transform.html +249 -0
  143. data/site/public/docs/renee-url-generation/_index.html +244 -0
  144. data/site/public/docs/renee-url-generation/class_list.html +47 -0
  145. data/site/public/docs/renee-url-generation/css/common.css +1 -0
  146. data/site/public/docs/renee-url-generation/css/full_list.css +55 -0
  147. data/site/public/docs/renee-url-generation/css/style.css +322 -0
  148. data/site/public/docs/renee-url-generation/file.README-renee-url-generation.html +69 -0
  149. data/site/public/docs/renee-url-generation/file_list.html +49 -0
  150. data/site/public/docs/renee-url-generation/frames.html +13 -0
  151. data/site/public/docs/renee-url-generation/index.html +69 -0
  152. data/site/public/docs/renee-url-generation/js/app.js +205 -0
  153. data/site/public/docs/renee-url-generation/js/full_list.js +167 -0
  154. data/site/public/docs/renee-url-generation/js/jquery.js +16 -0
  155. data/site/public/docs/renee-url-generation/method_list.html +590 -0
  156. data/site/public/docs/renee-url-generation/top-level-namespace.html +103 -0
  157. data/site/public/docs/renee/Renee.html +232 -0
  158. data/site/public/docs/renee/Renee/Application.html +367 -0
  159. data/site/public/docs/renee/Renee/Core.html +370 -0
  160. data/site/public/docs/renee/Renee/Core/Chaining.html +192 -0
  161. data/site/public/docs/renee/Renee/Core/ClassMethods.html +725 -0
  162. data/site/public/docs/renee/Renee/Core/ClientError.html +317 -0
  163. data/site/public/docs/renee/Renee/Core/EnvAccessors.html +152 -0
  164. data/site/public/docs/renee/Renee/Core/EnvAccessors/ClassMethods.html +354 -0
  165. data/site/public/docs/renee/Renee/Core/Matcher.html +675 -0
  166. data/site/public/docs/renee/Renee/Core/Plugins.html +475 -0
  167. data/site/public/docs/renee/Renee/Core/RackInteraction.html +488 -0
  168. data/site/public/docs/renee/Renee/Core/RequestContext.html +511 -0
  169. data/site/public/docs/renee/Renee/Core/Responding.html +877 -0
  170. data/site/public/docs/renee/Renee/Core/Response.html +691 -0
  171. data/site/public/docs/renee/Renee/Core/Routing.html +1589 -0
  172. data/site/public/docs/renee/Renee/Core/Transform.html +249 -0
  173. data/site/public/docs/renee/Renee/Core/URLGeneration.html +597 -0
  174. data/site/public/docs/renee/Renee/Render.html +877 -0
  175. data/site/public/docs/renee/Renee/Render/ClassMethods.html +382 -0
  176. data/site/public/docs/renee/Renee/Render/TemplateNotFound.html +126 -0
  177. data/site/public/docs/renee/Renee/Session.html +177 -0
  178. data/site/public/docs/renee/Renee/Session/ClassMethods.html +470 -0
  179. data/site/public/docs/renee/Renee/URLGeneration.html +142 -0
  180. data/site/public/docs/renee/Renee/URLGeneration/ClassMethods.html +593 -0
  181. data/site/public/docs/renee/Renee/Util.html +163 -0
  182. data/site/public/docs/renee/_index.html +336 -0
  183. data/site/public/docs/renee/class_list.html +47 -0
  184. data/site/public/docs/renee/css/common.css +1 -0
  185. data/site/public/docs/renee/css/full_list.css +55 -0
  186. data/site/public/docs/renee/css/style.css +322 -0
  187. data/site/public/docs/renee/file.README.html +212 -0
  188. data/site/public/docs/renee/file_list.html +49 -0
  189. data/site/public/docs/renee/frames.html +13 -0
  190. data/site/public/docs/renee/index.html +212 -0
  191. data/site/public/docs/renee/js/app.js +205 -0
  192. data/site/public/docs/renee/js/full_list.js +167 -0
  193. data/site/public/docs/renee/js/jquery.js +16 -0
  194. data/site/public/docs/renee/method_list.html +758 -0
  195. data/site/public/docs/renee/top-level-namespace.html +202 -0
  196. data/site/public/img/favicon.ico +0 -0
  197. data/site/public/img/reneeclean.png +0 -0
  198. data/site/public/img/russiangithub.png +0 -0
  199. data/site/public/img/stoneposter.png +0 -0
  200. data/site/public/img/vospit.jpeg +0 -0
  201. data/site/views/chaining.md +32 -0
  202. data/site/views/index.md +219 -0
  203. data/site/views/layouts/app.haml +16 -0
  204. data/site/views/rack-integration.md +51 -0
  205. data/site/views/responding.md +103 -0
  206. data/site/views/route-generation.md +82 -0
  207. data/site/views/routing.md +261 -0
  208. data/site/views/settings.md +19 -0
  209. data/site/views/team-renee.md +13 -0
  210. data/site/views/tutorial.md +57 -0
  211. data/site/views/variable-types.md +57 -0
  212. data/test.watchr +61 -0
  213. data/test/renee-core/chaining_test.rb +33 -0
  214. data/test/renee-core/env_accessors_test.rb +43 -0
  215. data/test/renee-core/include_test.rb +14 -0
  216. data/test/renee-core/request_context_test.rb +70 -0
  217. data/test/renee-core/responding_test.rb +128 -0
  218. data/test/renee-core/routing_test.rb +443 -0
  219. data/test/renee-core/test_helper.rb +4 -0
  220. data/test/renee-core/variable_type_test.rb +57 -0
  221. data/test/renee-render/render_test.rb +162 -0
  222. data/test/renee-render/test_helper.rb +9 -0
  223. data/test/renee-session/session_test.rb +31 -0
  224. data/test/renee-session/test_helper.rb +9 -0
  225. data/test/renee-url-generation/test_helper.rb +10 -0
  226. data/test/renee-url-generation/url_generation_test.rb +63 -0
  227. data/test/{blog_test.rb → renee/blog_test.rb} +10 -5
  228. data/test/renee/test_helper.rb +56 -0
  229. data/test/test_helper.rb +23 -10
  230. metadata +333 -156
  231. 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,4 @@
1
+ $: << File.expand_path('../../lib', __FILE__)
2
+ require 'renee/core'
3
+ # Load shared test helpers
4
+ require File.expand_path('../../test_helper', __FILE__)
@@ -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
+