require 'minitest/autorun' require 'prism' require 'support' class SampleApp < Prism::Application enable_sessions(secret: 'test-secret') before '/admin/*' do halt(401, 'unauthorized') unless params['token'] == 'let-me-in' end get '/' do 'root' end get '/users/:id' do json(id: params['id']) end get '/search' do json(q: params['q']) end post '/echo' do json(got: params.to_h) end get '/old' do redirect '/new', 301 end get '/greet/:name' do erb('

Hi <%= name %>

', locals: { name: params['name'] }) end get '/admin/panel' do json(secret: 'shown') end get '/count' do session['count'] = (session['count'] || 0) + 1 json(count: session['count']) end get '/first' do pass if params['skip'] == 'yes' 'first' end get '/first' do 'second' end end class ApplicationTest < Minitest::Test include TestSupport def call(method, path, **opts) SampleApp.call(env_for(method, path, **opts)) end def test_root status, _, body = call('GET', '/') assert_equal 200, status assert_equal 'root', body.join end def test_path_param status, headers, body = call('GET', '/users/77') assert_equal 200, status assert_equal 'application/json', headers['Content-Type'] assert_equal({ 'id' => '77' }, JSON.parse(body.join)) end def test_query_param _, _, body = call('GET', '/search?q=prism') assert_equal({ 'q' => 'prism' }, JSON.parse(body.join)) end def test_post_json payload = JSON.generate(name: 'x', n: 5) _, _, body = call('POST', '/echo', headers: { 'Content-Type' => 'application/json' }, body: payload) assert_equal({ 'name' => 'x', 'n' => 5 }, JSON.parse(body.join)['got']) end def test_redirect status, headers, = call('GET', '/old') assert_equal 301, status assert_equal '/new', headers['Location'] end def test_not_found status, _, body = call('GET', '/missing') assert_equal 404, status assert_includes body.join, 'Not Found' end def test_template_escaping _, _, body = call('GET', '/greet/%3Cb%3E') assert_equal '

Hi <b>

', body.join end def test_before_filter_blocks status, _, body = call('GET', '/admin/panel') assert_equal 401, status assert_equal 'unauthorized', body.join end def test_before_filter_allows status, _, body = call('GET', '/admin/panel?token=let-me-in') assert_equal 200, status assert_equal 'shown', JSON.parse(body.join)['secret'] end def test_session_write_and_read _, headers, body = call('GET', '/count') assert_equal 1, JSON.parse(body.join)['count'] cookie = headers['Set-Cookie'].split(';').first name, value = cookie.split('=', 2) _, _, body2 = call('GET', '/count', cookies: "#{name}=#{value}") assert_equal 2, JSON.parse(body2.join)['count'] end def test_pass _, _, body = call('GET', '/first?skip=yes') assert_equal 'second', body.join _, _, second = call('GET', '/first') assert_equal 'first', second.join end def test_head_has_empty_body status, _, body = call('HEAD', '/') assert_equal 200, status assert_equal '', body.join end def test_dispatch_emits_process_action_event_with_status events = [] subscriber = Prism::Instrumentation.subscribe('process_action.prism') { |event| events << event } begin call('GET', '/users/9') ensure Prism::Instrumentation.unsubscribe(subscriber) end assert_equal 1, events.size assert_equal 'GET', events.first.payload[:method] assert_equal '/users/9', events.first.payload[:path] assert_equal 200, events.first.payload[:status] end def test_dispatch_emits_event_for_not_found_too events = [] subscriber = Prism::Instrumentation.subscribe('process_action.prism') { |event| events << event } begin call('GET', '/missing') ensure Prism::Instrumentation.unsubscribe(subscriber) end assert_equal 1, events.size assert_equal 404, events.first.payload[:status] end end