|
18 | 18 | */ |
19 | 19 |
|
20 | 20 | #include <memory> |
| 21 | +#include <optional> |
21 | 22 | #include <string> |
22 | 23 | #include <string_view> |
23 | 24 | #include <unordered_map> |
@@ -1612,6 +1613,34 @@ TEST_F(FileScanTaskJsonTest, RoundTripsHistoricalSpecWithDroppedSourceField) { |
1612 | 1613 | EXPECT_EQ(serialized, json); |
1613 | 1614 | } |
1614 | 1615 |
|
| 1616 | +TEST_F(FileScanTaskJsonTest, RejectsNonNullPartitionForDroppedSourceField) { |
| 1617 | + auto json = JavaGolden(); |
| 1618 | + json["schema"]["fields"] = nlohmann::json::array(); |
| 1619 | + json["data-file"]["partition"] = {7}; |
| 1620 | + |
| 1621 | + // The embedded schema no longer contains the source type, so neither Java nor |
| 1622 | + // C++ can decode a non-null value for this historical partition field. |
| 1623 | + auto result = FileScanTaskFromJson(json); |
| 1624 | + EXPECT_THAT(result, IsError(ErrorKind::kNotSupported)); |
| 1625 | + EXPECT_THAT(result, HasErrorMessage("Unsupported type for literal JSON parsing")); |
| 1626 | +} |
| 1627 | + |
| 1628 | +TEST_F(FileScanTaskJsonTest, RejectsFilesWithMismatchedEmbeddedSpecId) { |
| 1629 | + for (bool mismatch_delete_file : {false, true}) { |
| 1630 | + SCOPED_TRACE(mismatch_delete_file ? "delete-file" : "data-file"); |
| 1631 | + auto json = JavaGolden(); |
| 1632 | + if (mismatch_delete_file) { |
| 1633 | + json["delete-files"][0]["spec-id"] = 1; |
| 1634 | + } else { |
| 1635 | + json["data-file"]["spec-id"] = 1; |
| 1636 | + } |
| 1637 | + |
| 1638 | + auto result = FileScanTaskFromJson(json); |
| 1639 | + EXPECT_THAT(result, IsError(ErrorKind::kJsonParseError)); |
| 1640 | + EXPECT_THAT(result, HasErrorMessage("Invalid partition spec id")); |
| 1641 | + } |
| 1642 | +} |
| 1643 | + |
1615 | 1644 | TEST_F(FileScanTaskJsonTest, AcceptsMissingPartitionLikeJava) { |
1616 | 1645 | auto json = JavaGolden(); |
1617 | 1646 | json["data-file"].erase("partition"); |
@@ -1684,6 +1713,21 @@ TEST_F(FileScanTaskJsonTest, RejectsInvalidContentRolesWhenSerializing) { |
1684 | 1713 | EXPECT_THAT(delete_result, HasErrorMessage("delete-file")); |
1685 | 1714 | } |
1686 | 1715 |
|
| 1716 | +TEST_F(FileScanTaskJsonTest, RejectsDeleteFilesWithDifferentSpecIdWhenSerializing) { |
| 1717 | + for (const auto& spec_id : {std::optional<int32_t>(1), std::optional<int32_t>()}) { |
| 1718 | + SCOPED_TRACE(spec_id.value_or(-1)); |
| 1719 | + auto delete_file = DeleteFileForTask(); |
| 1720 | + delete_file.partition_spec_id = spec_id; |
| 1721 | + FileScanTask task(std::make_shared<DataFile>(DataFileForTask()), |
| 1722 | + {std::make_shared<DataFile>(std::move(delete_file))}); |
| 1723 | + |
| 1724 | + auto result = ToJson(task, specs_, schema_); |
| 1725 | + EXPECT_THAT(result, IsError(ErrorKind::kValidationFailed)); |
| 1726 | + EXPECT_THAT(result, HasErrorMessage("Invalid partition spec id")); |
| 1727 | + EXPECT_THAT(result, HasErrorMessage(spec_id ? "actual = 1" : "actual = null")); |
| 1728 | + } |
| 1729 | +} |
| 1730 | + |
1687 | 1731 | TEST_F(FileScanTaskJsonTest, RejectsInvalidPartitionValueTypeWhenSerializing) { |
1688 | 1732 | auto data_file = DataFileForTask(); |
1689 | 1733 | data_file.partition = PartitionValues({Literal::String("not-an-int")}); |
|
0 commit comments