You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
5.1 KiB
120 lines
5.1 KiB
#include <Catch/fakeit.hpp> |
|
#include <http.hpp> |
|
|
|
using namespace std; |
|
|
|
TEST_CASE("Check http status"){ |
|
auto out=http::http_code(http::ok); |
|
REQUIRE(out.first == 200); |
|
REQUIRE(out.second == "OK"); |
|
// TODO test all |
|
} |
|
|
|
SCENARIO("http response"){ |
|
auto response=http::response(); |
|
std::stringstream ss; |
|
GIVEN("we stream our response without setting given any data"){ |
|
ss << response; |
|
THEN("the response will default to 200") |
|
REQUIRE(ss.str()=="HTTP/1.1 200 OK\r\nContent-Length: 6\r\n\r\n200 OK"s); |
|
} |
|
GIVEN("we stream our data with the response status set to 404"){ |
|
response.set_status(http::not_found); |
|
ss << response; |
|
THEN("the default 404 response will be sent instead"){ |
|
REQUIRE(ss.str()=="HTTP/1.1 404 Not Found\r\nContent-Length: 13\r\n\r\n404 Not Found"s); |
|
} |
|
} |
|
GIVEN("we stream our response with the status set to 204 No Content"){ |
|
response.set_status(http::no_content); |
|
ss << response; |
|
THEN("the response has no content header set") |
|
REQUIRE(ss.str()=="HTTP/1.1 204 No Content\r\n\r\n"s); |
|
} |
|
GIVEN("we stream our response with the body set"){ |
|
response.set_body("Easter eggs, everywhere! <a href=\"http://stream1.gifsoup.com/view4/4086928/x-x-everywhere-o.gif\">ye</a>"); |
|
ss << response; |
|
THEN("our response contains the appropriate headers") |
|
REQUIRE(ss.str()=="HTTP/1.1 200 OK\r\nContent-Length: 103\r\n\r\nEaster eggs, everywhere! <a href=\"http://stream1.gifsoup.com/view4/4086928/x-x-everywhere-o.gif\">ye</a>"s); |
|
} |
|
} |
|
|
|
SCENARIO("Stream http responses with a json response"){ |
|
auto response=http::json_response(); |
|
std::stringstream ss; |
|
GIVEN("we stream our response without setting any options"){ |
|
ss << response; |
|
THEN("our response is valid json and the response code is 200") |
|
REQUIRE(ss.str()=="HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: 26\r\n\r\n{\"code\":200,\"status\":\"OK\"}"s); |
|
} |
|
GIVEN("we set the response code to 404 and stream our response"){ |
|
response.set_status(http::not_found); |
|
ss << response; |
|
THEN("our response is valid json and the resoinse code is 404") |
|
REQUIRE(ss.str()=="HTTP/1.1 404 Not Found\r\nContent-Type: application/json\r\nContent-Length: 33\r\n\r\n{\"code\":404,\"status\":\"Not Found\"}"s); |
|
} |
|
GIVEN("we stream our response with the status set to 204 No Content"){ |
|
response.set_status(http::no_content); |
|
ss << response; |
|
THEN("the response has no content header set") |
|
REQUIRE(ss.str()=="HTTP/1.1 204 No Content\r\nContent-Type: application/json\r\n\r\n"s); |
|
} |
|
GIVEN("we stream our response with the body set"){ |
|
response.set_body(nlohmann::json::object()); |
|
ss << response; |
|
THEN("our response contains the appropriate headers") |
|
REQUIRE(ss.str()=="HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: 2\r\n\r\n{}"s); |
|
} |
|
} |
|
|
|
/* |
|
TEST(http_response_handler, header){ |
|
ServerTest s; |
|
auto req=s.create_request("GET /v1/session/torrents HTTP/1.1\r\nHost: localhost:8080\r\nFoo: bar\r\nFoo: bars\r\nContent-Type: application/json\r\n\r\n"); |
|
std::shared_ptr<ServerTest::Response> resp(new ServerTest::Response(nullptr)); |
|
http::request_handler out(req,resp); |
|
ASSERT_TRUE(out.header_set("Content-Type")); |
|
ASSERT_EQ(out.find_last_header_value("Content-Type"),"application/json"); |
|
ASSERT_EQ(out.find_last_header_value("Host"),"localhost:8080"); |
|
ASSERT_EQ(out.find_last_header_value("Foo"),"bars"); |
|
ASSERT_NE(out.find_last_header_value("Foo"), "bar"); |
|
ASSERT_FALSE(out.header_set("Content-Length")); |
|
ASSERT_TRUE(out.header_equals("Content-Type","application/json")); |
|
} |
|
|
|
TEST(http_response_handler, json_response){ |
|
ServerTest s; |
|
auto req=s.create_request("GET /v1/session/torrents HTTP/1.1\r\nHost: localhost:8080\r\nContent-Type: application/json\r\n\r\n"); |
|
std::shared_ptr<ServerTest::Response> resp(new ServerTest::Response(nullptr)); |
|
http::request_handler out(req,resp); |
|
out.respond(nlohmann::json("{}")); |
|
std::stringstream ss; |
|
ss << resp->rdbuf(); |
|
std::string string_response(ss.str()); |
|
ASSERT_EQ(string_response,"HTTP/1.1 200 OK\r\nContent-Length: 4\r\nContent-Type: application/json\r\n\r\n\"{}\""); |
|
} |
|
|
|
TEST(http_response_handler, string_response){ |
|
ServerTest s; |
|
auto req=s.create_request("GET /v1/session/torrents HTTP/1.1\r\nHost: localhost:8080\r\nContent-Type: application/json\r\n\r\n"); |
|
std::shared_ptr<ServerTest::Response> resp(new ServerTest::Response(nullptr)); |
|
http::request_handler out(req,resp); |
|
out.respond(std::string("{}")); |
|
std::stringstream ss; |
|
ss << resp->rdbuf(); |
|
std::string string_response(ss.str()); |
|
ASSERT_EQ(string_response,"HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\n{}"); |
|
} |
|
|
|
TEST(http_response_handler, empty_string){ |
|
ServerTest s; |
|
auto req=s.create_request("GET /v1/session/torrents HTTP/1.1\r\nHost: localhost:8080\r\nContent-Type: application/json\r\n\r\n"); |
|
std::shared_ptr<ServerTest::Response> resp(new ServerTest::Response(nullptr)); |
|
http::request_handler out(req,resp); |
|
out.respond(std::string("")); |
|
std::stringstream ss; |
|
ss << resp->rdbuf(); |
|
std::string string_response(ss.str()); |
|
ASSERT_EQ(string_response,"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); |
|
} |
|
*/ |