azure-sdk-for-cpp/sdk/tables/azure-data-tables/test/ut/transactions_test.cpp
George Arama acc98f1b06
Transaction insert replace (#5642)
* fix insertreplace

* rename method

* re

* rere
2024-05-22 09:49:46 -07:00

190 lines
6.6 KiB
C++

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
#include "transactions_test.hpp"
#include <chrono>
#include <sstream>
#include <string>
#include <thread>
using namespace Azure::Data::Tables;
namespace Azure { namespace Data { namespace Test {
const std::string url("someUrl");
const std::string tableName("someTableName");
const std::string partitionKey("somePartitionKey");
const std::string rowKey("someRowKey");
TEST_F(TransactionsBodyTest, TransactionCreate)
{
std::vector<Models::TransactionStep> steps;
TableClient client("http://localhost:7777", "table");
auto ser = client.PreparePayload("batch", "changeset", steps);
EXPECT_EQ(
ser,
"--batch\nContent-Type: multipart/mixed; "
"boundary=changeset\n\n\n\n--changeset--\n--batch\n");
}
TEST_F(TransactionsBodyTest, TransactionBodyAddOp)
{
std::vector<Models::TransactionStep> steps;
TableClient client(url, tableName);
Azure::Data::Tables::Models::TableEntity entity;
entity.SetRowKey(rowKey);
entity.SetPartitionKey(partitionKey);
steps.emplace_back(Models::TransactionStep{Models::TransactionActionType::Add, entity});
auto serialized = client.PreparePayload("batch_", "changeset_1", steps);
CheckTransactionBody(serialized, Models::TransactionActionType::Add);
}
TEST_F(TransactionsBodyTest, TransactionBodyInsertMergeOp)
{
std::vector<Models::TransactionStep> steps;
TableClient client(url, tableName);
Azure::Data::Tables::Models::TableEntity entity;
entity.SetRowKey(rowKey);
entity.SetPartitionKey(partitionKey);
steps.emplace_back(Models::TransactionStep{Models::TransactionActionType::InsertMerge, entity});
auto serialized = client.PreparePayload("batch_", "changeset_1", steps);
CheckTransactionBody(serialized, Models::TransactionActionType::InsertMerge);
}
TEST_F(TransactionsBodyTest, TransactionBodyInsertReplaceOp)
{
std::vector<Models::TransactionStep> steps;
TableClient client(url, tableName);
Azure::Data::Tables::Models::TableEntity entity;
entity.SetRowKey(rowKey);
entity.SetPartitionKey(partitionKey);
steps.emplace_back(
Models::TransactionStep{Models::TransactionActionType::InsertReplace, entity});
auto serialized = client.PreparePayload("batch_", "changeset_1", steps);
CheckTransactionBody(serialized, Models::TransactionActionType::InsertReplace);
}
TEST_F(TransactionsBodyTest, TransactionBodyDeleteOp)
{
std::vector<Models::TransactionStep> steps;
TableClient client(url, tableName);
Azure::Data::Tables::Models::TableEntity entity;
entity.SetRowKey(rowKey);
entity.SetPartitionKey(partitionKey);
steps.emplace_back(Models::TransactionStep{Models::TransactionActionType::Delete, entity});
auto serialized = client.PreparePayload("batch_", "changeset_1", steps);
CheckTransactionBody(serialized, Models::TransactionActionType::Delete);
}
TEST_F(TransactionsBodyTest, TransactionBodyUpdateMergeOp)
{
std::vector<Models::TransactionStep> steps;
TableClient client(url, tableName);
Azure::Data::Tables::Models::TableEntity entity;
entity.SetRowKey(rowKey);
entity.SetPartitionKey(partitionKey);
steps.emplace_back(Models::TransactionStep{Models::TransactionActionType::UpdateMerge, entity});
auto serialized = client.PreparePayload("batch_", "changeset_1", steps);
CheckTransactionBody(serialized, Models::TransactionActionType::UpdateMerge);
}
TEST_F(TransactionsBodyTest, TransactionBodyUpdateReplaceOp)
{
std::vector<Models::TransactionStep> steps;
TableClient client(url, tableName);
Azure::Data::Tables::Models::TableEntity entity;
entity.SetRowKey(rowKey);
entity.SetPartitionKey(partitionKey);
steps.emplace_back(
Models::TransactionStep{Models::TransactionActionType::UpdateReplace, entity});
auto serialized = client.PreparePayload("batch_", "changeset_1", steps);
CheckTransactionBody(serialized, Models::TransactionActionType::UpdateReplace);
}
void TransactionsBodyTest::CheckContentLines(
std::vector<std::string> const& lines,
Models::TransactionActionType action)
{
EXPECT_EQ(lines[0], "--" + changeset);
EXPECT_EQ(lines[1], "Content-Type: application/http");
EXPECT_EQ(lines[2], "Content-Transfer-Encoding: binary");
switch (action)
{
case Models::TransactionActionType::Add:
EXPECT_EQ(lines[4], "POST " + url + "/" + tableName + " HTTP/1.1");
break;
case Models::TransactionActionType::Delete:
EXPECT_EQ(
lines[4],
"DELETE " + url + "/" + tableName + "(PartitionKey='" + partitionKey + "',RowKey='"
+ rowKey + "') HTTP/1.1");
break;
case Models::TransactionActionType::UpdateMerge:
EXPECT_EQ(
lines[4],
"MERGE " + url + "/" + tableName + "(PartitionKey='" + partitionKey + "',RowKey='"
+ rowKey + "') HTTP/1.1");
break;
case Models::TransactionActionType::UpdateReplace:
EXPECT_EQ(
lines[4],
"PUT " + url + "/" + tableName + "(PartitionKey='" + partitionKey + "',RowKey='"
+ rowKey + "') HTTP/1.1");
break;
case Models::TransactionActionType::InsertMerge:
EXPECT_EQ(
lines[4],
"MERGE " + url + "/" + tableName + "(PartitionKey='" + partitionKey + "',RowKey='"
+ rowKey + "') HTTP/1.1");
break;
case Models::TransactionActionType::InsertReplace:
EXPECT_EQ(
lines[4],
"PATCH " + url + "/" + tableName + "(PartitionKey='" + partitionKey + "',RowKey='"
+ rowKey + "') HTTP/1.1");
break;
}
EXPECT_EQ(lines[lines.size() - 1], "--" + changeset + "--");
}
void TransactionsBodyTest::CheckTransactionBody(
std::string const& body,
Models::TransactionActionType action)
{
(void)action;
std::stringstream ss(body);
std::string line;
std::getline(ss, line, '\n');
// line1
EXPECT_EQ(line.substr(0, 8), "--batch_");
EXPECT_EQ(line.size(), 8);
batch = line.substr(2, line.length() - 1);
// line2
std::getline(ss, line, '\n');
EXPECT_EQ(line, "Content-Type: multipart/mixed; boundary=changeset_1");
changeset = line.substr(40, line.length() - 1);
// line3
std::getline(ss, line, '\n');
EXPECT_EQ(line, "");
std::vector<std::string> contentLines;
std::getline(ss, line, '\n');
while (line != "--" + batch)
{
contentLines.push_back(line);
std::getline(ss, line, '\n');
}
CheckContentLines(contentLines, action);
EXPECT_EQ(line, "--" + batch);
}
}}} // namespace Azure::Data::Test