test: add test harness with http and router tests

This commit is contained in:
dualfroz committed 2026-08-27 11:40:00 +02:00
1 parent b8e3b2cd55
commit c079abed00
6 files changed
+239

No files matched your search

+94
View File
@@ -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