kemal/spec/route_handler_spec.cr

175 lines
5.2 KiB
Crystal
Raw Normal View History

require "./spec_helper"
2016-02-03 20:08:54 +00:00
describe "Kemal::RouteHandler" do
it "routes" do
2016-03-21 16:29:48 +00:00
get "/" do
"hello"
end
request = HTTP::Request.new("GET", "/")
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
2016-01-24 10:22:25 +00:00
client_response.body.should eq("hello")
end
2015-05-29 21:21:15 +00:00
it "routes request with query string" do
2016-03-21 16:29:48 +00:00
get "/" do |env|
"hello #{env.params.query["message"]}"
2015-05-29 21:21:15 +00:00
end
request = HTTP::Request.new("GET", "/?message=world")
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
2016-01-24 10:22:25 +00:00
client_response.body.should eq("hello world")
2015-05-29 21:21:15 +00:00
end
2015-10-26 18:49:28 +00:00
it "routes request with multiple query strings" do
2016-04-12 11:41:09 +00:00
get "/" do |env|
"hello #{env.params.query["message"]} time #{env.params.query["time"]}"
2015-10-26 18:49:28 +00:00
end
request = HTTP::Request.new("GET", "/?message=world&time=now")
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
2016-01-24 10:22:25 +00:00
client_response.body.should eq("hello world time now")
2015-10-26 18:49:28 +00:00
end
it "route parameter has more precedence than query string arguments" do
2016-03-21 16:29:48 +00:00
get "/:message" do |env|
"hello #{env.params.url["message"]}"
end
request = HTTP::Request.new("GET", "/world?message=coco")
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
2016-01-24 10:22:25 +00:00
client_response.body.should eq("hello world")
end
2015-11-06 18:24:38 +00:00
it "parses simple JSON body" do
2016-03-21 16:29:48 +00:00
post "/" do |env|
name = env.params.json["name"]
age = env.params.json["age"]
2015-11-06 18:24:38 +00:00
"Hello #{name} Age #{age}"
end
json_payload = {"name": "Serdar", "age": 26}
request = HTTP::Request.new(
"POST",
"/",
body: json_payload.to_json,
2016-06-14 21:18:00 +00:00
headers: HTTP::Headers{"Content-Type" => "application/json"},
2015-11-06 18:24:38 +00:00
)
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
2016-01-24 10:22:25 +00:00
client_response.body.should eq("Hello Serdar Age 26")
2015-11-06 18:24:38 +00:00
end
it "parses JSON with string array" do
2016-03-21 16:29:48 +00:00
post "/" do |env|
2016-06-14 21:18:00 +00:00
skills = env.params.json["skills"].as(Array)
2015-11-06 18:24:38 +00:00
"Skills #{skills.each.join(',')}"
end
json_payload = {"skills": ["ruby", "crystal"]}
request = HTTP::Request.new(
"POST",
"/",
body: json_payload.to_json,
2016-06-14 21:18:00 +00:00
headers: HTTP::Headers{"Content-Type" => "application/json"},
2015-11-06 18:24:38 +00:00
)
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
2016-01-24 10:22:25 +00:00
client_response.body.should eq("Skills ruby,crystal")
2015-11-06 18:24:38 +00:00
end
it "parses JSON with json object array" do
2016-03-21 16:29:48 +00:00
post "/" do |env|
2016-06-14 21:18:00 +00:00
skills = env.params.json["skills"].as(Array)
2015-11-06 18:24:38 +00:00
skills_from_languages = skills.map do |skill|
2016-06-14 21:18:00 +00:00
skill = skill.as(Hash)
2015-11-06 18:24:38 +00:00
skill["language"]
end
"Skills #{skills_from_languages.each.join(',')}"
end
json_payload = {"skills": [{"language": "ruby"}, {"language": "crystal"}]}
request = HTTP::Request.new(
"POST",
"/",
body: json_payload.to_json,
2016-06-14 21:18:00 +00:00
headers: HTTP::Headers{"Content-Type" => "application/json"},
2015-11-06 18:24:38 +00:00
)
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
2016-01-24 10:22:25 +00:00
client_response.body.should eq("Skills ruby,crystal")
2015-11-06 18:24:38 +00:00
end
2015-11-27 20:45:13 +00:00
it "checks for _method param in POST request to simulate PUT" do
2016-03-21 16:29:48 +00:00
put "/" do |env|
"Hello World from PUT"
end
request = HTTP::Request.new(
"POST",
"/",
body: "_method=PUT",
2016-06-14 21:18:00 +00:00
headers: HTTP::Headers{"Content-Type" => "application/x-www-form-urlencoded"}
)
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
2016-01-24 10:22:25 +00:00
client_response.body.should eq("Hello World from PUT")
end
it "checks for _method param in POST request to simulate PATCH" do
2016-03-21 16:29:48 +00:00
patch "/" do |env|
"Hello World from PATCH"
end
request = HTTP::Request.new(
"POST",
"/",
body: "_method=PATCH",
2016-06-14 21:18:00 +00:00
headers: HTTP::Headers{"Content-Type" => "application/x-www-form-urlencoded; charset=UTF-8"}
)
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
2016-01-24 10:22:25 +00:00
client_response.body.should eq("Hello World from PATCH")
end
it "checks for _method param in POST request to simulate DELETE" do
2016-03-21 16:29:48 +00:00
delete "/" do |env|
"Hello World from DELETE"
end
json_payload = {"_method": "DELETE"}
request = HTTP::Request.new(
"POST",
"/",
body: "_method=DELETE",
2016-06-14 21:18:00 +00:00
headers: HTTP::Headers{"Content-Type" => "application/x-www-form-urlencoded; charset=UTF-8"}
)
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
2016-01-24 10:22:25 +00:00
client_response.body.should eq("Hello World from DELETE")
end
it "can process HTTP HEAD requests for defined GET routes" do
2016-03-21 16:29:48 +00:00
get "/" do |env|
"Hello World from GET"
end
request = HTTP::Request.new("HEAD", "/")
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
2016-01-24 10:22:25 +00:00
client_response.status_code.should eq(200)
end
2016-01-24 10:52:41 +00:00
it "redirects user to provided url" do
2016-03-21 16:29:48 +00:00
get "/" do |env|
2016-01-24 10:52:41 +00:00
env.redirect "/login"
end
request = HTTP::Request.new("GET", "/")
2016-03-21 16:29:48 +00:00
client_response = call_request_on_app(request)
client_response.status_code.should eq(302)
2016-01-24 10:52:41 +00:00
client_response.headers.has_key?("Location").should eq(true)
end
it "sets default Content-Type to context html" do
get "/" do |env|
"Hello World from GET"
end
request = HTTP::Request.new("GET", "/")
client_response = call_request_on_app(request)
client_response.content_type.should eq("text/html")
end
2016-06-19 00:22:55 +00:00
it "sets X-Powered-By to Kemal" do
get "/" {}
request = HTTP::Request.new("GET", "/")
client_response = call_request_on_app(request)
client_response.headers["X-Powered-By"].should eq("Kemal")
end
end