test: add test harness with http and router tests
This commit is contained in:
1 parent
b8e3b2cd55
commit
c079abed00
6 files changed
+239
No files matched your search
@@ -0,0 +1,6 @@
|
||||
$LOAD_PATH.unshift(File.expand_path('../lib', __dir__))
|
||||
$LOAD_PATH.unshift(__dir__)
|
||||
|
||||
require 'minitest/autorun'
|
||||
|
||||
Dir[File.join(__dir__, 'test_*.rb')].sort.each { |file| require file }
|
||||
@@ -0,0 +1,24 @@
|
||||
require 'prism'
|
||||
require 'stringio'
|
||||
|
||||
module TestSupport
|
||||
def env_for(method, path, headers: {}, body: nil, cookies: nil)
|
||||
path_part, query = path.split('?', 2)
|
||||
env = {
|
||||
'REQUEST_METHOD' => method.to_s.upcase,
|
||||
'PATH_INFO' => path_part,
|
||||
'QUERY_STRING' => query.to_s,
|
||||
'rack.input' => StringIO.new(body || ''),
|
||||
'CONTENT_LENGTH' => (body ? body.bytesize.to_s : '0')
|
||||
}
|
||||
headers.each do |name, value|
|
||||
if name.downcase == 'content-type'
|
||||
env['CONTENT_TYPE'] = value
|
||||
else
|
||||
env["HTTP_#{name.upcase.tr('-', '_')}"] = value
|
||||
end
|
||||
end
|
||||
env['HTTP_COOKIE'] = cookies if cookies
|
||||
env
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,37 @@
|
||||
require 'minitest/autorun'
|
||||
require 'prism'
|
||||
|
||||
class InflectorTest < Minitest::Test
|
||||
include Prism::Inflector
|
||||
|
||||
def test_underscore
|
||||
assert_equal 'posts_controller', underscore('PostsController')
|
||||
assert_equal 'html_parser', underscore('HTMLParser')
|
||||
end
|
||||
|
||||
def test_camelize
|
||||
assert_equal 'PostsController', camelize('posts_controller')
|
||||
end
|
||||
|
||||
def test_pluralize
|
||||
assert_equal 'posts', pluralize('post')
|
||||
assert_equal 'categories', pluralize('category')
|
||||
assert_equal 'boxes', pluralize('box')
|
||||
assert_equal 'leaves', pluralize('leaf')
|
||||
end
|
||||
|
||||
def test_singularize
|
||||
assert_equal 'category', singularize('categories')
|
||||
assert_equal 'post', singularize('posts')
|
||||
assert_equal 'box', singularize('boxes')
|
||||
end
|
||||
|
||||
def test_tableize
|
||||
assert_equal 'categories', tableize('Category')
|
||||
assert_equal 'posts', tableize('Post')
|
||||
end
|
||||
|
||||
def test_classify
|
||||
assert_equal 'Category', classify('categories')
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,46 @@
|
||||
require 'minitest/autorun'
|
||||
require 'prism'
|
||||
require 'support'
|
||||
|
||||
class RequestTest < Minitest::Test
|
||||
include TestSupport
|
||||
|
||||
def test_query_params
|
||||
request = Prism::Request.new(env_for('GET', '/s?q=ruby&page=3'))
|
||||
assert_equal 'ruby', request.params['q']
|
||||
assert_equal '3', request.params['page']
|
||||
end
|
||||
|
||||
def test_json_body
|
||||
payload = JSON.generate(name: 'foksiu', role: 'admin')
|
||||
request = Prism::Request.new(env_for('POST', '/u', headers: { 'Content-Type' => 'application/json' }, body: payload))
|
||||
assert_equal 'foksiu', request.params['name']
|
||||
assert_equal 'admin', request.params[:role]
|
||||
end
|
||||
|
||||
def test_form_body
|
||||
request = Prism::Request.new(env_for('POST', '/u', headers: { 'Content-Type' => 'application/x-www-form-urlencoded' }, body: 'a=1&b=two'))
|
||||
assert_equal '1', request.params['a']
|
||||
assert_equal 'two', request.params['b']
|
||||
end
|
||||
|
||||
def test_cookies
|
||||
request = Prism::Request.new(env_for('GET', '/', cookies: 'foo=bar; baz=qux'))
|
||||
assert_equal 'bar', request.cookies['foo']
|
||||
assert_equal 'qux', request.cookies['baz']
|
||||
end
|
||||
|
||||
def test_headers
|
||||
request = Prism::Request.new(env_for('GET', '/', headers: { 'X-Custom' => 'yes' }))
|
||||
assert_equal 'yes', request.headers['X-Custom']
|
||||
end
|
||||
|
||||
def test_params_precedence
|
||||
env = env_for('POST', '/x?id=query',
|
||||
headers: { 'Content-Type' => 'application/x-www-form-urlencoded' },
|
||||
body: 'id=body')
|
||||
request = Prism::Request.new(env)
|
||||
request.path_params = { 'id' => 'path' }
|
||||
assert_equal 'path', request.params['id']
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,32 @@
|
||||
require 'minitest/autorun'
|
||||
require 'prism'
|
||||
|
||||
class ResponseTest < Minitest::Test
|
||||
def test_defaults
|
||||
status, headers, body = Prism::Response.new.finish
|
||||
assert_equal 200, status
|
||||
assert_equal 'text/html;charset=utf-8', headers['Content-Type']
|
||||
assert_equal [], body
|
||||
end
|
||||
|
||||
def test_write
|
||||
response = Prism::Response.new
|
||||
response << 'a'
|
||||
response.write('b')
|
||||
assert_equal %w[a b], response.finish[2]
|
||||
end
|
||||
|
||||
def test_set_cookie
|
||||
response = Prism::Response.new
|
||||
response.set_cookie('token', 'abc def')
|
||||
assert_includes response.headers['Set-Cookie'], 'token=abc+def'
|
||||
assert_includes response.headers['Set-Cookie'], 'HttpOnly'
|
||||
end
|
||||
|
||||
def test_multiple_cookies
|
||||
response = Prism::Response.new
|
||||
response.set_cookie('a', '1')
|
||||
response.set_cookie('b', '2')
|
||||
assert_equal 2, response.headers['Set-Cookie'].split("\n").size
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,94 @@
|
||||
require 'minitest/autorun'
|
||||
require 'prism'
|
||||
|
||||
class RouterTest < Minitest::Test
|
||||
def setup
|
||||
@router = Prism::Router.new
|
||||
end
|
||||
|
||||
def test_static_match
|
||||
@router.add('GET', '/health') {}
|
||||
matches = @router.matches('GET', '/health')
|
||||
assert_equal 1, matches.size
|
||||
assert_equal({}, matches.first[1])
|
||||
end
|
||||
|
||||
def test_named_param
|
||||
@router.add('GET', '/users/:id') {}
|
||||
_, params = @router.matches('GET', '/users/42').first
|
||||
assert_equal '42', params['id']
|
||||
end
|
||||
|
||||
def test_multiple_params
|
||||
@router.add('GET', '/users/:uid/posts/:pid') {}
|
||||
_, params = @router.matches('GET', '/users/7/posts/99').first
|
||||
assert_equal '7', params['uid']
|
||||
assert_equal '99', params['pid']
|
||||
end
|
||||
|
||||
def test_wildcard
|
||||
@router.add('GET', '/files/*') {}
|
||||
_, params = @router.matches('GET', '/files/a/b/c.txt').first
|
||||
assert_equal ['a/b/c.txt'], params['splat']
|
||||
end
|
||||
|
||||
def test_method_mismatch
|
||||
@router.add('POST', '/submit') {}
|
||||
assert_empty @router.matches('GET', '/submit')
|
||||
end
|
||||
|
||||
def test_no_match
|
||||
@router.add('GET', '/x') {}
|
||||
assert_empty @router.matches('GET', '/y')
|
||||
end
|
||||
|
||||
def test_param_unescape
|
||||
@router.add('GET', '/say/:word') {}
|
||||
_, params = @router.matches('GET', '/say/hello%20world').first
|
||||
assert_equal 'hello world', params['word']
|
||||
end
|
||||
|
||||
def test_dot_is_literal
|
||||
@router.add('GET', '/a.b') {}
|
||||
assert_empty @router.matches('GET', '/axb')
|
||||
assert_equal 1, @router.matches('GET', '/a.b').size
|
||||
end
|
||||
|
||||
def test_all_http_verbs_supported
|
||||
%w[GET POST PUT PATCH DELETE OPTIONS HEAD].each do |verb|
|
||||
@router.add(verb, '/verb-check') {}
|
||||
assert_equal 1, @router.matches(verb, '/verb-check').size, "#{verb} should match"
|
||||
end
|
||||
end
|
||||
|
||||
def test_named_route_path
|
||||
@router.add('GET', '/posts/:id', name: :post) {}
|
||||
assert_equal '/posts/7', @router.path_to(:post, id: 7)
|
||||
end
|
||||
|
||||
def test_named_route_path_escapes_values
|
||||
@router.add('GET', '/search/:term', name: :search) {}
|
||||
assert_equal '/search/hello%20world', @router.path_to(:search, term: 'hello world')
|
||||
end
|
||||
|
||||
def test_named_route_missing_param_raises
|
||||
@router.add('GET', '/posts/:id', name: :post) {}
|
||||
assert_raises(ArgumentError) { @router.path_to(:post, {}) }
|
||||
end
|
||||
|
||||
def test_unknown_named_route_raises
|
||||
assert_raises(ArgumentError) { @router.path_to(:nope) }
|
||||
end
|
||||
|
||||
def test_controller_route_flag
|
||||
route = @router.add('GET', '/posts/:id', to: 'posts#show')
|
||||
assert route.controller_route?
|
||||
assert_equal 'posts', route.controller_name
|
||||
assert_equal 'show', route.action_name
|
||||
end
|
||||
|
||||
def test_block_route_is_not_a_controller_route
|
||||
route = @router.add('GET', '/health') {}
|
||||
refute route.controller_route?
|
||||
end
|
||||
end
|
||||
Reference in new issue
Block a user