Validate operations and preconditions

This commit is contained in:
2025-08-14 15:18:43 -04:00
parent 40fa403ec5
commit 176922e394
2 changed files with 338 additions and 3 deletions

View File

@@ -132,6 +132,289 @@ TEST_CASE("CommitRequest basic parsing") {
}
}
TEST_CASE("CommitRequest precondition and operation validation") {
CommitRequest request;
SUBCASE("Valid point_read precondition") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"preconditions": [
{
"type": "point_read",
"key": "dGVzdA=="
}
]
})";
REQUIRE(request.parse_json(json));
REQUIRE(request.is_parse_complete());
}
SUBCASE("Invalid point_read precondition - missing key") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"preconditions": [
{
"type": "point_read"
}
]
})";
REQUIRE_FALSE(request.parse_json(json));
REQUIRE_FALSE(request.is_parse_complete());
}
SUBCASE("Valid point_read precondition - empty key") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"preconditions": [
{
"type": "point_read",
"key": ""
}
]
})";
REQUIRE(request.parse_json(json));
REQUIRE(request.is_parse_complete());
}
SUBCASE("Valid range_read precondition") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"preconditions": [
{
"type": "range_read",
"begin": "dGVzdA==",
"end": "dGVzdFo="
}
]
})";
REQUIRE(request.parse_json(json));
REQUIRE(request.is_parse_complete());
}
SUBCASE("Valid range_read precondition - empty begin/end") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"preconditions": [
{
"type": "range_read",
"begin": "",
"end": ""
}
]
})";
REQUIRE(request.parse_json(json));
REQUIRE(request.is_parse_complete());
}
SUBCASE("Invalid range_read precondition - missing begin") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"preconditions": [
{
"type": "range_read",
"end": "dGVzdFo="
}
]
})";
REQUIRE_FALSE(request.parse_json(json));
REQUIRE_FALSE(request.is_parse_complete());
}
SUBCASE("Invalid range_read precondition - missing end") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"preconditions": [
{
"type": "range_read",
"begin": "dGVzdA=="
}
]
})";
REQUIRE_FALSE(request.parse_json(json));
REQUIRE_FALSE(request.is_parse_complete());
}
SUBCASE("Valid write operation") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"operations": [
{
"type": "write",
"key": "dGVzdA==",
"value": "dmFsdWU="
}
]
})";
REQUIRE(request.parse_json(json));
REQUIRE(request.is_parse_complete());
}
SUBCASE("Valid write operation - empty key and value") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"operations": [
{
"type": "write",
"key": "",
"value": ""
}
]
})";
REQUIRE(request.parse_json(json));
REQUIRE(request.is_parse_complete());
}
SUBCASE("Invalid write operation - missing key") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"operations": [
{
"type": "write",
"value": "dmFsdWU="
}
]
})";
REQUIRE_FALSE(request.parse_json(json));
REQUIRE_FALSE(request.is_parse_complete());
}
SUBCASE("Invalid write operation - missing value") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"operations": [
{
"type": "write",
"key": "dGVzdA=="
}
]
})";
REQUIRE_FALSE(request.parse_json(json));
REQUIRE_FALSE(request.is_parse_complete());
}
SUBCASE("Valid delete operation") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"operations": [
{
"type": "delete",
"key": "dGVzdA=="
}
]
})";
REQUIRE(request.parse_json(json));
REQUIRE(request.is_parse_complete());
}
SUBCASE("Invalid delete operation - missing key") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"operations": [
{
"type": "delete"
}
]
})";
REQUIRE_FALSE(request.parse_json(json));
REQUIRE_FALSE(request.is_parse_complete());
}
SUBCASE("Valid range_delete operation") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"operations": [
{
"type": "range_delete",
"begin": "dGVzdA==",
"end": "dGVzdFo="
}
]
})";
REQUIRE(request.parse_json(json));
REQUIRE(request.is_parse_complete());
}
SUBCASE("Invalid range_delete operation - missing begin") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"operations": [
{
"type": "range_delete",
"end": "dGVzdFo="
}
]
})";
REQUIRE_FALSE(request.parse_json(json));
REQUIRE_FALSE(request.is_parse_complete());
}
SUBCASE("Invalid range_delete operation - missing end") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"operations": [
{
"type": "range_delete",
"begin": "dGVzdA=="
}
]
})";
REQUIRE_FALSE(request.parse_json(json));
REQUIRE_FALSE(request.is_parse_complete());
}
SUBCASE("Mixed valid and invalid operations") {
std::string json = R"({
"leader_id": "leader456",
"read_version": 12345,
"operations": [
{
"type": "write",
"key": "dGVzdA==",
"value": "dmFsdWU="
},
{
"type": "delete"
}
]
})";
REQUIRE_FALSE(request.parse_json(json));
REQUIRE_FALSE(request.is_parse_complete());
}
}
TEST_CASE("CommitRequest memory management") {
CommitRequest request;