#include #include #include #include #include #include #include #include "httpServer.hpp" using namespace cpr; static HttpServer* server = new HttpServer(); TEST(UrlEncodedPostTests, UrlPostSingleTest) { Url url{server->GetBaseUrl() + "/url_post.html"}; Response response = cpr::Post(url, Payload{{"x", "5"}}); std::string expected_text{ "{\n" " \"x\": 5\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, UrlPostAddPayloadPair) { Url url{server->GetBaseUrl() + "/url_post.html"}; Payload payload{{"x", "1"}}; payload.Add({"y", "2"}); Response response = cpr::Post(url, payload); std::string expected_text{ "{\n" " \"x\": 1,\n" " \"y\": 2,\n" " \"sum\": 3\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); } TEST(UrlEncodedPostTests, UrlPostPayloadIteratorTest) { Url url{server->GetBaseUrl() + "/url_post.html"}; std::vector payloadData; payloadData.emplace_back("x", "1"); payloadData.emplace_back("y", "2"); Response response = cpr::Post(url, Payload(payloadData.begin(), payloadData.end())); std::string expected_text{ "{\n" " \"x\": 1,\n" " \"y\": 2,\n" " \"sum\": 3\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); } TEST(UrlEncodedPostTests, UrlPostEncodeTest) { Url url{server->GetBaseUrl() + "/url_post.html"}; Response response = cpr::Post(url, Payload{{"x", "hello world!!~"}}); std::string expected_text{ "{\n" " \"x\": hello world!!~\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, UrlPostEncodeNoCopyTest) { Url url{server->GetBaseUrl() + "/url_post.html"}; Payload payload{{"x", "hello world!!~"}}; // payload lives through the lifetime of Post, so it doesn't need to be copied Response response = cpr::Post(url, payload); std::string expected_text{ "{\n" " \"x\": hello world!!~\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, UrlPostManyTest) { Url url{server->GetBaseUrl() + "/url_post.html"}; Response response = cpr::Post(url, Payload{{"x", "5"}, {"y", "13"}}); std::string expected_text{ "{\n" " \"x\": 5,\n" " \"y\": 13,\n" " \"sum\": 18\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, UrlPostBadHostTest) { Url url{"http://bad_host/"}; Response response = cpr::Post(url, Payload{{"hello", "world"}}); EXPECT_EQ(std::string{}, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{}, response.header["content-type"]); EXPECT_EQ(0, response.status_code); EXPECT_EQ(ErrorCode::HOST_RESOLUTION_FAILURE, response.error.code); } TEST(UrlEncodedPostTests, FormPostSingleTest) { Url url{server->GetBaseUrl() + "/form_post.html"}; Response response = cpr::Post(url, Multipart{{"x", 5}}); std::string expected_text{ "{\n" " \"x\": \"5\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostFileTest) { std::string filename{"test_file"}; std::string content{"hello world"}; std::ofstream test_file; test_file.open(filename); test_file << content; test_file.close(); Url url{server->GetBaseUrl() + "/form_post.html"}; Response response = cpr::Post(url, Multipart{{"x", File{filename}}}); std::string expected_text{ "{\n" " \"x\": \"test_file=" + content + "\"\n" "}"}; std::remove(filename.c_str()); EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostMultipleFilesTestLvalue) { Url url{server->GetBaseUrl() + "/form_post.html"}; std::string filename1{"file1"}; std::string content1{"apple"}; std::ofstream file1; file1.open(filename1); file1 << content1; file1.close(); std::string filename2{"file2"}; std::string content2{"banana"}; std::ofstream file2; file2.open(filename2); file2 << content2; file2.close(); File singleFile{"file1"}; File singleFileWithOverridenFilename{"file1", "applefile"}; Files multipleFiles{"file1", "file2"}; Files multipleFilesWithOverridenFilename{ File{"file1", "applefile"}, File{"file2", "bananafile"}, }; { Response response = cpr::Post(url, Multipart{{"files", singleFile}}); std::string expected_text{ "{\n" " \"files\": \"file1=" + content1 + "\"\n}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } { Response response = cpr::Post(url, Multipart{{"singleFile", singleFileWithOverridenFilename}}); std::string expected_text{ "{\n" " \"singleFile\": \"applefile=" + content1 + "\"\n}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } { Response response = cpr::Post(url, Multipart{{"files", multipleFiles}}); std::string expected_text{ "{\n" " \"files\": \"file1=" + content1 + "\",\n" " \"files\": \"file2=" + content2 + "\"\n}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } { Response response = cpr::Post(url, Multipart{{"files", multipleFilesWithOverridenFilename}}); std::string expected_text{ "{\n" " \"files\": \"applefile=" + content1 + "\",\n" " \"files\": \"bananafile=" + content2 + "\"\n}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } std::remove(filename1.c_str()); std::remove(filename2.c_str()); } TEST(UrlEncodedPostTests, FormPostMultipleFilesTestRvalue) { Url url{server->GetBaseUrl() + "/form_post.html"}; std::string filename1{"file1"}; std::string content1{"apple"}; std::ofstream file1; file1.open(filename1); file1 << content1; file1.close(); std::string filename2{"file2"}; std::string content2{"banana"}; std::ofstream file2; file2.open(filename2); file2 << content2; file2.close(); { Response response = cpr::Post(url, Multipart{{"files", File{"file1"}}}); std::string expected_text{ "{\n" " \"files\": \"file1=" + content1 + "\"\n}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } { Response response = cpr::Post(url, Multipart{{"files", File{"file1", "applefile"}}}); std::string expected_text{ "{\n" " \"files\": \"applefile=" + content1 + "\"\n}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } { Response response = cpr::Post(url, Multipart{{"files", Files{"file1", "file2"}}}); std::string expected_text{ "{\n" " \"files\": \"file1=" + content1 + "\",\n" " \"files\": \"file2=" + content2 + "\"\n}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } { Response response = cpr::Post(url, Multipart{{"files", Files{ File{"file1", "applefile"}, File{"file2", "bananafile"}, }}}); std::string expected_text{ "{\n" " \"files\": \"applefile=" + content1 + "\",\n" " \"files\": \"bananafile=" + content2 + "\"\n}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } std::remove(filename1.c_str()); std::remove(filename2.c_str()); } TEST(UrlEncodedPostTests, FormPostFileTestWithOverridenFilename) { std::string filename{"test_file"}; std::string overided_filename{"overided_filename"}; std::string content{"hello world"}; std::ofstream test_file; test_file.open(filename); test_file << content; test_file.close(); Url url{server->GetBaseUrl() + "/form_post.html"}; Response response = cpr::Post(url, Multipart{{"x", File{filename, overided_filename}}}); std::string expected_text{ "{\n" " \"x\": \"" + overided_filename + "=" + content + "\"\n" "}"}; std::remove(filename.c_str()); EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostFileNoCopyTest) { std::string filename{"./test_file"}; std::string content{"hello world"}; std::ofstream test_file; test_file.open(filename); test_file << content; test_file.close(); Url url{server->GetBaseUrl() + "/form_post.html"}; Multipart multipart{{"x", File{filename}}}; Response response = cpr::Post(url, multipart); std::string expected_text{ "{\n" " \"x\": \"test_file=" + content + "\"\n" "}"}; std::remove(filename.c_str()); EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostFileNoCopyTestWithOverridenFilename) { std::string filename{"test_file"}; std::string overriden_filename{"overided_filename"}; std::string content{"hello world"}; std::ofstream test_file; test_file.open(filename); test_file << content; test_file.close(); Url url{server->GetBaseUrl() + "/form_post.html"}; Multipart multipart{{"x", File{filename, overriden_filename}}}; Response response = cpr::Post(url, multipart); std::string expected_text{ "{\n" " \"x\": \"" + overriden_filename + "=" + content + "\"\n" "}"}; std::remove(filename.c_str()); EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, TimeoutPostTest) { Url url{server->GetBaseUrl() + "/json_post.html"}; std::string body{R"({"RegisterObject": {"DeviceID": "65010000005030000001"}})"}; cpr::Response response = cpr::Post(url, cpr::Header{{"Content-Type", "application/json"}}, cpr::Body{body}, cpr::ConnectTimeout{3000}, cpr::Timeout{3000}); std::string expected_text{R"({"RegisterObject": {"DeviceID": "65010000005030000001"}})"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostFileBufferTest) { std::string content{"hello world"}; Url url{server->GetBaseUrl() + "/form_post.html"}; Response response = cpr::Post(url, Multipart{{"x", Buffer{content.begin(), content.end(), "test_file"}}}); std::string expected_text{ "{\n" " \"x\": \"test_file=" + content + "\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostFileBufferNoCopyTest) { std::string content{"hello world"}; Url url{server->GetBaseUrl() + "/form_post.html"}; Multipart multipart{{"x", Buffer{content.begin(), content.end(), "test_file"}}}; Response response = cpr::Post(url, multipart); std::string expected_text{ "{\n" " \"x\": \"test_file=" + content + "\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostFileBufferPointerTest) { const char* content = "hello world"; Url url{server->GetBaseUrl() + "/form_post.html"}; Response response = cpr::Post(url, Multipart{{"x", Buffer{content, 11 + content, "test_file"}}}); std::string expected_text{ "{\n" " \"x\": \"test_file=" + std::string(content) + "\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostFileBufferArrayTest) { const char content[] = "hello world"; Url url{server->GetBaseUrl() + "/form_post.html"}; // We subtract 1 from std::end() because we don't want to include the terminating null Response response = cpr::Post(url, Multipart{{"x", Buffer{std::begin(content), std::end(content) - 1, "test_file"}}}); std::string expected_text{ "{\n" " \"x\": \"test_file=" + std::string(content) + "\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostFileBufferVectorTest) { std::vector content{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'}; Url url{server->GetBaseUrl() + "/form_post.html"}; Response response = cpr::Post(url, Multipart{{"x", Buffer{content.begin(), content.end(), "test_file"}}}); std::string expected_text{ "{\n" " \"x\": \"test_file=hello world\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostFileBufferStdArrayTest) { std::array content{{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'}}; Url url{server->GetBaseUrl() + "/form_post.html"}; Response response = cpr::Post(url, Multipart{{"x", Buffer{content.begin(), content.end(), "test_file"}}}); std::string expected_text{ "{\n" " \"x\": \"test_file=hello world\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostBufferRvalueTest) { std::vector content{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'}; Url url{server->GetBaseUrl() + "/form_post.html"}; Response response = cpr::Post(url, Multipart{{"x", Buffer{content.begin(), content.end(), "test_file"}}}); std::string expected_text{ "{\n" " \"x\": \"test_file=hello world\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, ReflectPostBufferLvalueTest) { std::vector content{'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'}; Url url{server->GetBaseUrl() + "/form_post.html"}; Buffer buff{content.begin(), content.end(), "test_file"}; Response response = cpr::Post(url, Multipart{{"x", buff}}); std::string expected_text{ "{\n" " \"x\": \"test_file=hello world\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostManyTest) { Url url{server->GetBaseUrl() + "/form_post.html"}; Response response = cpr::Post(url, Multipart{{"x", 5}, {"y", 13}}); std::string expected_text{ "{\n" " \"x\": \"5\",\n" " \"y\": \"13\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostManyNoCopyTest) { Url url{server->GetBaseUrl() + "/form_post.html"}; Multipart multipart{{"x", 5}, {"y", 13}}; Response response = cpr::Post(url, multipart); std::string expected_text{ "{\n" " \"x\": \"5\",\n" " \"y\": \"13\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostContentTypeTest) { Url url{server->GetBaseUrl() + "/form_post.html"}; Response response = cpr::Post(url, Multipart{{"x", 5, "application/number"}}); std::string expected_text{ "{\n" " \"x\": \"5\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, FormPostContentTypeLValueTest) { Url url{server->GetBaseUrl() + "/form_post.html"}; Multipart multipart{{"x", 5, "application/number"}}; Response response = cpr::Post(url, multipart); std::string expected_text{ "{\n" " \"x\": \"5\"\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, UrlPostAsyncSingleTest) { Url url{server->GetBaseUrl() + "/url_post.html"}; Payload payload{{"x", "5"}}; std::vector responses; for (size_t i = 0; i < 10; ++i) { responses.emplace_back(cpr::PostAsync(url, payload)); } for (cpr::AsyncResponse& future_response : responses) { cpr::Response response = future_response.get(); std::string expected_text{ "{\n" " \"x\": 5\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } } TEST(UrlEncodedPostTests, UrlReflectTest) { Url url{server->GetBaseUrl() + "/header_reflect.html"}; Response response = cpr::Post(url, Payload{{"x", "5"}}); std::string expected_text{"Header reflect POST"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(200, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(UrlEncodedPostTests, PostWithNoBodyTest) { Url url{server->GetBaseUrl() + "/form_post.html"}; Response response = cpr::Post(url); std::string expected_text{"{\n}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } static std::string getTimestamp() { char buf[1000]; time_t now = time(0); struct tm* tm = gmtime(&now); strftime(buf, sizeof buf, "%a, %d %b %Y %H:%M:%S GMT", tm); return buf; } TEST(UrlEncodedPostTests, PostReflectTest) { std::string uri = server->GetBaseUrl() + "/post_reflect.html"; std::string body = R"({"property1": "value1"})"; std::string contentType = "application/json"; std::string signature = "x-ms-date: something"; std::string logType = "LoggingTest"; std::string date = getTimestamp(); Response response = cpr::Post(cpr::Url(uri), cpr::Header{{"content-type", contentType}, {"Authorization", signature}, {"log-type", logType}, {"x-ms-date", date}, {"content-length", std::to_string(body.length())}}, cpr::Body(body)); EXPECT_EQ(ErrorCode::OK, response.error.code); EXPECT_EQ(200, response.status_code); EXPECT_EQ(body, response.text); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(signature, response.header["Authorization"]); EXPECT_EQ(logType, response.header["log-type"]); EXPECT_EQ(date, response.header["x-ms-date"]); EXPECT_EQ(std::to_string(body.length()), response.header["content-length"]); } TEST(UrlEncodedPostTests, PostReflectPayloadTest) { std::string uri = server->GetBaseUrl() + "/header_reflect.html"; cpr::Payload payload = cpr::Payload{{"email", ""}, {"password", ""}, {"devicetoken", ""}}; cpr::Response response = cpr::Post(cpr::Url(uri), cpr::Timeout{10000}, payload); EXPECT_EQ(ErrorCode::OK, response.error.code); EXPECT_EQ(200, response.status_code); } TEST(UrlEncodedPostTests, InjectMultipleHeadersTest) { std::string uri = server->GetBaseUrl() + "/post_reflect.html"; std::string key_1 = "key_1"; std::string val_1 = "value_1"; std::string key_2 = "key_2"; std::string val_2 = "value_2"; cpr::Response response = cpr::Post(cpr::Url{uri}, cpr::Header{{key_1, val_1}}, cpr::Header{{key_2, val_2}}); EXPECT_EQ(ErrorCode::OK, response.error.code); EXPECT_EQ(200, response.status_code); EXPECT_EQ(val_1, response.header[key_1]); EXPECT_EQ(val_2, response.header[key_2]); } TEST(UrlEncodedPostTests, PostBodyWithFile) { std::string filename{"test_file"}; std::string expected_text(R"({"property1": "value1"})"); std::ofstream test_file; test_file.open(filename); test_file << expected_text; test_file.close(); Url url{server->GetBaseUrl() + "/post_reflect.html"}; cpr::Response response = Post(url, cpr::Header({{"Content-Type", "application/octet-stream"}}), cpr::Body(File("test_file"))); EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(ErrorCode::OK, response.error.code); EXPECT_EQ(std::string{"application/octet-stream"}, response.header["content-type"]); EXPECT_EQ(200, response.status_code); } TEST(UrlEncodedPostTests, PostBodyWithBuffer) { Url url{server->GetBaseUrl() + "/post_reflect.html"}; std::string expected_text(R"({"property1": "value1"})"); cpr::Response response = Post(url, cpr::Header({{"Content-Type", "application/octet-stream"}}), cpr::Body(Buffer{expected_text.begin(), expected_text.end(), "test_file"})); EXPECT_EQ(expected_text, response.text); EXPECT_EQ(url, response.url); EXPECT_EQ(std::string{"application/octet-stream"}, response.header["content-type"]); EXPECT_EQ(200, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(PostRedirectTests, TempRedirectTest) { Url url{server->GetBaseUrl() + "/temporary_redirect.html"}; Response response = cpr::Post(url, Payload{{"x", "5"}}, Header{{"RedirectLocation", "url_post.html"}}); std::string expected_text{ "{\n" " \"x\": 5\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(response.url, server->GetBaseUrl() + "/url_post.html"); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(PostRedirectTests, TempRedirectNoneTest) { Url url{server->GetBaseUrl() + "/temporary_redirect.html"}; Response response = cpr::Post(url, Payload{{"x", "5"}}, Header{{"RedirectLocation", "url_post.html"}}, Redirect(PostRedirectFlags::NONE)); EXPECT_EQ(response.url, server->GetBaseUrl() + "/url_post.html"); EXPECT_EQ(405, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(PostRedirectTests, PermRedirectTest) { Url url{server->GetBaseUrl() + "/permanent_redirect.html"}; Response response = cpr::Post(url, Payload{{"x", "5"}}, Header{{"RedirectLocation", "url_post.html"}}); std::string expected_text{ "{\n" " \"x\": 5\n" "}"}; EXPECT_EQ(expected_text, response.text); EXPECT_EQ(response.url, server->GetBaseUrl() + "/url_post.html"); EXPECT_EQ(std::string{"application/json"}, response.header["content-type"]); EXPECT_EQ(201, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } TEST(PostRedirectTests, PermRedirectNoneTest) { Url url{server->GetBaseUrl() + "/permanent_redirect.html"}; Response response = cpr::Post(url, Payload{{"x", "5"}}, Header{{"RedirectLocation", "url_post.html"}}, Redirect(PostRedirectFlags::NONE)); EXPECT_EQ(response.url, server->GetBaseUrl() + "/url_post.html"); EXPECT_EQ(405, response.status_code); EXPECT_EQ(ErrorCode::OK, response.error.code); } int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); ::testing::AddGlobalTestEnvironment(server); return RUN_ALL_TESTS(); }