libcpr/test/post_tests.cpp
2024-04-13 21:01:22 -04:00

757 lines
29 KiB
C++

#include <gtest/gtest.h>
#include <array>
#include <cstdio>
#include <fstream>
#include <string>
#include <cpr/cpr.h>
#include <cpr/multipart.h>
#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<Pair> 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<unsigned char> 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<unsigned char, 11> 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<unsigned char> 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<unsigned char> 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<AsyncResponse> 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();
}