lydia 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,297 @@
1
+ require 'spec_helper'
2
+ require 'rack/test'
3
+ require 'lydia/router'
4
+
5
+ describe "Router" do
6
+ include Rack::Test::Methods
7
+
8
+ class TestRouter < Lydia::Router
9
+ get '/' do
10
+ get_response('<H1>Hello world!</H1>')
11
+ end
12
+
13
+ get '/204' do
14
+ get_response('', 204)
15
+ end
16
+
17
+ get '/500' do
18
+ raise StandardError.new('Error!')
19
+ end
20
+
21
+ head '/request' do get_response('head'); end
22
+ get '/request' do get_response('get'); end
23
+ patch '/request' do get_response('patch'); end
24
+ put '/request' do get_response('put'); end
25
+ post '/request' do get_response('post'); end
26
+ delete '/request' do get_response('delete'); end
27
+ options '/request' do get_response('options'); end
28
+
29
+ namespace '/namespace' do
30
+ get '/hello' do
31
+ get_response('Hello from namespace')
32
+ end
33
+
34
+ namespace '/nested' do
35
+ get '/hello' do
36
+ get_response('Hello from nested namespace')
37
+ end
38
+ end
39
+
40
+ namespace '/api/v:version' do
41
+ get '/posts' do
42
+ get_response("Namespace api version #{request.params[:version]}")
43
+ end
44
+ end
45
+ end
46
+
47
+ get '/querystring_params' do
48
+ get_response(request.params['name'])
49
+ end
50
+
51
+ get '/wildcard/*' do
52
+ get_response('')
53
+ end
54
+
55
+ get %r{/regexp$}i do
56
+ get_response('')
57
+ end
58
+
59
+ get '/users/:id/comments/:comment_id/edit' do
60
+ get_response("#{request.params[:id]}-#{request.params[:comment_id]}")
61
+ end
62
+
63
+ get '/api/v:version/users' do
64
+ get_response(request.params[:version])
65
+ end
66
+
67
+ get '/halt' do
68
+ halt
69
+ end
70
+
71
+ get '/custom_halt' do
72
+ halt get_response('', 204)
73
+ end
74
+
75
+ get '/next_route' do
76
+ next_route
77
+ end
78
+
79
+ get '/next_route' do
80
+ get_response('Next route works!')
81
+ end
82
+
83
+ def get_response(body, status = 200)
84
+ [status, { 'Content-Type' => 'text/html', 'Content-Length'=> body.length.to_s }, [body]]
85
+ end
86
+ end
87
+
88
+ def app
89
+ TestRouter.new
90
+ end
91
+
92
+ context 'Status codes' do
93
+ it 'returns 204' do
94
+ get '/204'
95
+ expect(last_response.status).to eq(204)
96
+ end
97
+
98
+ it 'returns 404' do
99
+ get '/not_found'
100
+ expect(last_response.status).to eq(404)
101
+ end
102
+
103
+ it 'returns 500' do
104
+ get '/500'
105
+ expect(last_response.status).to eq(500)
106
+ end
107
+ end
108
+
109
+ context 'Response' do
110
+ it "returns a valid response" do
111
+ get '/'
112
+ expect(last_response).to_not be_nil
113
+ expect(last_response.status).to eq(200)
114
+ expect(last_response.headers.to_hash).to eq({'Content-Type' => 'text/html', 'Content-Length' => '21'})
115
+ expect(last_response.body).to eq('<H1>Hello world!</H1>')
116
+ end
117
+ end
118
+
119
+ context 'HTTP methods' do
120
+ it 'HEAD /request' do
121
+ head '/request'
122
+ expect(last_response.status).to eq(200)
123
+ expect(last_response.body).to eq('head')
124
+ end
125
+
126
+ it 'GET /request' do
127
+ get '/request'
128
+ expect(last_response.status).to eq(200)
129
+ expect(last_response.body).to eq('get')
130
+ end
131
+
132
+ it 'PATCH /request' do
133
+ patch '/request'
134
+ expect(last_response.status).to eq(200)
135
+ expect(last_response.body).to eq('patch')
136
+ end
137
+
138
+ it 'PUT /request' do
139
+ put '/request'
140
+ expect(last_response.status).to eq(200)
141
+ expect(last_response.body).to eq('put')
142
+ end
143
+
144
+ it 'POST /request' do
145
+ post '/request'
146
+ expect(last_response.status).to eq(200)
147
+ expect(last_response.body).to eq('post')
148
+ end
149
+
150
+ it 'DELETE /request' do
151
+ delete '/request'
152
+ expect(last_response.status).to eq(200)
153
+ expect(last_response.body).to eq('delete')
154
+ end
155
+
156
+ it 'OPTIONS /request' do
157
+ options '/request'
158
+ expect(last_response.status).to eq(200)
159
+ expect(last_response.body).to eq('options')
160
+ end
161
+ end
162
+
163
+ context 'Routing' do
164
+
165
+ context 'Namespace' do
166
+ it 'GET /namespace/hello' do
167
+ get '/namespace/hello'
168
+ expect(last_response.status).to eq(200)
169
+ expect(last_response.body).to eq('Hello from namespace')
170
+ end
171
+
172
+ it 'GET /namespace/nested/hello' do
173
+ get '/namespace/nested/hello'
174
+ expect(last_response.status).to eq(200)
175
+ expect(last_response.body).to eq('Hello from nested namespace')
176
+ end
177
+
178
+ it 'GET /namespace/api/v3/posts' do
179
+ get '/namespace/api/v3/posts'
180
+ expect(last_response.status).to eq(200)
181
+ expect(last_response.body).to eq('Namespace api version 3')
182
+ end
183
+ end
184
+
185
+ context 'Wildcards' do
186
+ it 'GET wildcard' do
187
+ get '/wildcard'
188
+ expect(last_response.status).to eq(200)
189
+ end
190
+
191
+ it 'GET wildcard/' do
192
+ get '/wildcard/'
193
+ expect(last_response.status).to eq(200)
194
+ end
195
+
196
+ it 'GET wildcard/hello' do
197
+ get '/wildcard/hello'
198
+ expect(last_response.status).to eq(200)
199
+ end
200
+
201
+ it 'GET wildcard/hello/bob' do
202
+ get '/wildcard/hello/bob'
203
+ expect(last_response.status).to eq(200)
204
+ end
205
+ end
206
+
207
+ context 'Regular expressions' do
208
+ it 'GET /Regexp' do
209
+ get '/Regexp'
210
+ expect(last_response.status).to eq(200)
211
+ end
212
+ end
213
+
214
+ context 'Next route' do
215
+ it 'Goto next route' do
216
+ get '/next_route'
217
+ expect(last_response.status).to eq(200)
218
+ expect(last_response.body).to eq('Next route works!')
219
+ end
220
+ end
221
+
222
+ context 'Named parameters' do
223
+ it 'GET /users/3/comments/138/edit' do
224
+ get '/users/3/comments/138/edit'
225
+ expect(last_response.status).to eq(200)
226
+ expect(last_response.body).to eq('3-138')
227
+ end
228
+
229
+ it 'GET /api/v2/users' do
230
+ get '/api/v2/users'
231
+ expect(last_response.status).to eq(200)
232
+ expect(last_response.body).to eq('2')
233
+ end
234
+ end
235
+
236
+ context 'Query string params' do
237
+ it 'GET /querystring_params' do
238
+ get '/querystring_params', { name: 'bob' }
239
+ expect(last_response.status).to eq(200)
240
+ expect(last_response.body).to eq('bob')
241
+ end
242
+ end
243
+
244
+ context 'Route not valid' do
245
+ it 'returns ArgumentError' do
246
+ expect {
247
+ class WrongRoute < Lydia::Router
248
+ get Object do
249
+ end
250
+ end
251
+ }.to raise_error(ArgumentError)
252
+ end
253
+ end
254
+ end
255
+
256
+ let(:router) { Lydia::Router.new }
257
+
258
+ context 'Instance methods' do
259
+ it 'responds to request' do
260
+ expect(router).to respond_to(:request)
261
+ end
262
+
263
+ it 'responds to response' do
264
+ expect(router).to respond_to(:response)
265
+ end
266
+
267
+ it 'responds to env' do
268
+ expect(router).to respond_to(:env)
269
+ end
270
+ end
271
+
272
+ context 'Halt' do
273
+ it 'returns 500 (default halt)' do
274
+ get '/halt'
275
+ expect(last_response.status).to eq(500)
276
+ expect(last_response.body).to include('halted')
277
+ end
278
+
279
+ it 'returns 204 (custom halt)' do
280
+ get '/custom_halt'
281
+ expect(last_response.status).to eq(204)
282
+ expect(last_response.body).to eq('')
283
+ end
284
+ end
285
+
286
+ context 'Class methods' do
287
+ it 'responds to call' do
288
+ expect(Lydia::Router).to respond_to(:call)
289
+ end
290
+
291
+ it 'is initialized' do
292
+ get '/'
293
+ expect(last_response.status).to eq(200)
294
+ end
295
+ end
296
+
297
+ end
@@ -0,0 +1,4 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
4
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
@@ -0,0 +1 @@
1
+ <%= message %>
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'rack/test'
3
+ require 'lydia/application'
4
+
5
+ describe "Templates" do
6
+ include Rack::Test::Methods
7
+
8
+ class TemplatesHelpers < Lydia::Application
9
+ get '/render' do
10
+ render 'spec/templates/template.erb', nil, message: 'template'
11
+ end
12
+ end
13
+
14
+ def app
15
+ TemplatesHelpers.new
16
+ end
17
+
18
+ it 'render an erb template' do
19
+ get '/render'
20
+ expect(last_response.status).to eq(200)
21
+ expect(last_response.body).to include('template')
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,187 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lydia
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mirko Mignini
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-12-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coveralls
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack-test
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: tilt
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Lightweight, fast and easy to use small ruby web framework.
112
+ email:
113
+ - mirko.mignini@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rspec"
120
+ - ".travis.yml"
121
+ - Gemfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - bin/console
126
+ - bin/setup
127
+ - examples/hello_world.rb
128
+ - lib/lydia.rb
129
+ - lib/lydia/application.rb
130
+ - lib/lydia/delegator.rb
131
+ - lib/lydia/filters.rb
132
+ - lib/lydia/halted.rb
133
+ - lib/lydia/helpers.rb
134
+ - lib/lydia/not_found.rb
135
+ - lib/lydia/request.rb
136
+ - lib/lydia/response.rb
137
+ - lib/lydia/route.rb
138
+ - lib/lydia/router.rb
139
+ - lib/lydia/standard_pages.rb
140
+ - lib/lydia/templates.rb
141
+ - lib/lydia/version.rb
142
+ - lydia.gemspec
143
+ - spec/application_spec.rb
144
+ - spec/delegator_spec.rb
145
+ - spec/filters_spec.rb
146
+ - spec/helpers_spec.rb
147
+ - spec/middleware_spec.rb
148
+ - spec/response_spec.rb
149
+ - spec/router_spec.rb
150
+ - spec/spec_helper.rb
151
+ - spec/templates/template.erb
152
+ - spec/templates_spec.rb
153
+ homepage: https://github.com/MirkoMignini/lydia
154
+ licenses:
155
+ - MIT
156
+ metadata: {}
157
+ post_install_message:
158
+ rdoc_options: []
159
+ require_paths:
160
+ - lib
161
+ required_ruby_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ requirements: []
172
+ rubyforge_project:
173
+ rubygems_version: 2.5.0
174
+ signing_key:
175
+ specification_version: 4
176
+ summary: Lightweight, fast and easy to use small ruby web framework.
177
+ test_files:
178
+ - spec/application_spec.rb
179
+ - spec/delegator_spec.rb
180
+ - spec/filters_spec.rb
181
+ - spec/helpers_spec.rb
182
+ - spec/middleware_spec.rb
183
+ - spec/response_spec.rb
184
+ - spec/router_spec.rb
185
+ - spec/spec_helper.rb
186
+ - spec/templates/template.erb
187
+ - spec/templates_spec.rb