test: cover IntegrationSampleApp and IntegrationTestingTest
This commit is contained in:
1 parent
4f9d79eb56
commit
a52d7861fe
1 file changed
+161
@@ -0,0 +1,161 @@
|
||||
require 'minitest/autorun'
|
||||
require 'prism'
|
||||
|
||||
class IntegrationSampleApp < Prism::Application
|
||||
enable_sessions(secret: 'integration-test-secret')
|
||||
|
||||
get '/' do
|
||||
'welcome'
|
||||
end
|
||||
|
||||
get '/dashboard' do
|
||||
halt(401, 'not logged in') unless session['user']
|
||||
"hello #{session['user']}"
|
||||
end
|
||||
|
||||
post '/login' do
|
||||
name = params['user'] && params['user']['name']
|
||||
if name == 'alice'
|
||||
session['user'] = name
|
||||
redirect '/dashboard'
|
||||
else
|
||||
halt(401, 'bad credentials')
|
||||
end
|
||||
end
|
||||
|
||||
post '/logout' do
|
||||
session.clear
|
||||
redirect '/'
|
||||
end
|
||||
|
||||
get '/echo' do
|
||||
json(params.to_h)
|
||||
end
|
||||
|
||||
post '/echo' do
|
||||
json(params.to_h)
|
||||
end
|
||||
|
||||
get '/ip' do
|
||||
env['REMOTE_ADDR']
|
||||
end
|
||||
|
||||
get '/boom' do
|
||||
halt(500, 'server exploded')
|
||||
end
|
||||
|
||||
get '/export' do
|
||||
stream do |out|
|
||||
out.write("id,name\n")
|
||||
out.write("1,alice\n")
|
||||
out.write("2,bob\n")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class IntegrationTestingTest < Minitest::Test
|
||||
include Prism::Testing::IntegrationTest
|
||||
integration_app IntegrationSampleApp
|
||||
|
||||
def test_get_root
|
||||
get '/'
|
||||
assert_response :success
|
||||
assert_equal 'welcome', response.body
|
||||
end
|
||||
|
||||
def test_dashboard_requires_login
|
||||
get '/dashboard'
|
||||
assert_response :unauthorized
|
||||
end
|
||||
|
||||
def test_login_persists_session_cookie_across_requests
|
||||
post '/login', params: { user: { name: 'alice' } }
|
||||
assert_response :redirect
|
||||
assert_equal '/dashboard', response.location
|
||||
|
||||
follow_redirect!
|
||||
assert_response :success
|
||||
assert_equal 'hello alice', response.body
|
||||
end
|
||||
|
||||
def test_login_with_bad_credentials_stays_unauthorized
|
||||
post '/login', params: { user: { name: 'mallory' } }
|
||||
assert_response :unauthorized
|
||||
end
|
||||
|
||||
def test_logout_clears_the_session
|
||||
post '/login', params: { user: { name: 'alice' } }
|
||||
follow_redirect!
|
||||
assert_response :success
|
||||
|
||||
post '/logout'
|
||||
assert_response :redirect
|
||||
follow_redirect!
|
||||
|
||||
get '/dashboard'
|
||||
assert_response :unauthorized
|
||||
end
|
||||
|
||||
def test_get_params_are_parsed_with_bracket_nesting
|
||||
get '/echo', params: { q: 'hello world', filter: { tag: 'a' } }
|
||||
assert_response :success
|
||||
parsed = response.json
|
||||
assert_equal 'hello world', parsed['q']
|
||||
assert_equal 'a', parsed.dig('filter', 'tag')
|
||||
end
|
||||
|
||||
def test_post_params_support_arrays
|
||||
post '/echo', params: { tags: %w[a b c] }
|
||||
assert_response :success
|
||||
assert_equal %w[a b c], response.json['tags']
|
||||
end
|
||||
|
||||
def test_two_sessions_do_not_share_cookies
|
||||
browser_a = Prism::Testing::IntegrationSession.new(IntegrationSampleApp)
|
||||
browser_b = Prism::Testing::IntegrationSession.new(IntegrationSampleApp)
|
||||
|
||||
browser_a.post('/login', params: { user: { name: 'alice' } })
|
||||
browser_a.follow_redirect!
|
||||
assert browser_a.response.success?
|
||||
|
||||
response_b = browser_b.get('/dashboard')
|
||||
assert response_b.client_error?
|
||||
assert_equal 401, response_b.status
|
||||
end
|
||||
|
||||
def test_follow_redirect_without_a_prior_redirect_raises
|
||||
get '/'
|
||||
error = assert_raises(RuntimeError) { follow_redirect! }
|
||||
assert_match(/no redirect to follow/, error.message)
|
||||
end
|
||||
|
||||
def test_remote_addr_can_be_simulated_per_request
|
||||
get '/ip', remote_addr: '10.0.0.7'
|
||||
assert_equal '10.0.0.7', response.body
|
||||
|
||||
get '/ip'
|
||||
assert_equal '127.0.0.1', response.body
|
||||
end
|
||||
|
||||
def test_assert_response_accepts_integer_status
|
||||
get '/boom'
|
||||
assert_response 500
|
||||
end
|
||||
|
||||
def test_assert_response_rejects_unknown_symbol
|
||||
get '/'
|
||||
assert_raises(ArgumentError) { assert_response(:teapot) }
|
||||
end
|
||||
|
||||
# Prism::StreamingBody responses never touch a real socket in this
|
||||
# harness (see Prism::Testing::TestResponse#initialize) - IntegrationTest
|
||||
# itself only ever exercised Controller actions with an ordinary Array
|
||||
# body, so nothing proved the `get`/`post` DSL methods here could drive a
|
||||
# streaming route through Application#call without blowing up on
|
||||
# finalize_body's `streaming?` guard or on the join-based TestResponse.
|
||||
def test_streaming_route_is_drained_into_the_response_body_in_order
|
||||
get '/export'
|
||||
assert_response :success
|
||||
assert_equal "id,name\n1,alice\n2,bob\n", response.body
|
||||
end
|
||||
end
|
||||
Reference in new issue
Block a user