|
33 | 33 | #include "iceberg/type.h" |
34 | 34 |
|
35 | 35 | namespace iceberg { |
36 | | -namespace { |
37 | | - |
38 | | -std::shared_ptr<Schema> MakeSnapshotsSchema() { |
39 | | - return std::make_shared<Schema>(std::vector<SchemaField>{ |
40 | | - SchemaField::MakeRequired(1, "committed_at", timestamp_tz()), |
41 | | - SchemaField::MakeRequired(2, "snapshot_id", int64()), |
42 | | - SchemaField::MakeOptional(3, "parent_id", int64()), |
43 | | - SchemaField::MakeOptional(4, "operation", string()), |
44 | | - SchemaField::MakeOptional(5, "manifest_list", string()), |
45 | | - SchemaField::MakeOptional( |
46 | | - 6, "summary", |
47 | | - std::make_shared<MapType>(SchemaField::MakeRequired(7, "key", string()), |
48 | | - SchemaField::MakeRequired(8, "value", string())))}); |
49 | | -} |
50 | | - |
51 | | -std::shared_ptr<Schema> MakeHistorySchema() { |
52 | | - return std::make_shared<Schema>(std::vector<SchemaField>{ |
53 | | - SchemaField::MakeRequired(1, "made_current_at", timestamp_tz()), |
54 | | - SchemaField::MakeRequired(2, "snapshot_id", int64()), |
55 | | - SchemaField::MakeOptional(3, "parent_id", int64()), |
56 | | - SchemaField::MakeRequired(4, "is_current_ancestor", boolean())}); |
57 | | -} |
58 | | - |
59 | | -} // namespace |
60 | 36 |
|
61 | 37 | class MetadataTableTest : public ::testing::Test { |
62 | 38 | protected: |
63 | 39 | void SetUp() override { |
64 | | - io_ = std::make_shared<MockFileIO>(); |
65 | | - catalog_ = std::make_shared<MockCatalog>(); |
66 | | - |
67 | 40 | auto schema = std::make_shared<Schema>( |
68 | 41 | std::vector<SchemaField>{SchemaField::MakeRequired(1, "id", int64()), |
69 | 42 | SchemaField::MakeOptional(2, "name", string())}, |
70 | 43 | 1); |
71 | | - metadata_ = std::make_shared<TableMetadata>( |
| 44 | + auto metadata = std::make_shared<TableMetadata>( |
72 | 45 | TableMetadata{.format_version = 2, .schemas = {schema}, .current_schema_id = 1}); |
73 | 46 |
|
74 | | - TableIdentifier source_ident{.ns = Namespace{.levels = {"db"}}, |
75 | | - .name = "source_table"}; |
76 | | - auto source_table_result = |
77 | | - Table::Make(source_ident, metadata_, "s3://bucket/meta.json", io_, catalog_); |
78 | | - EXPECT_THAT(source_table_result, IsOk()); |
79 | | - source_table_ = *source_table_result; |
80 | | - |
81 | | - auto snapshots_table_result = |
82 | | - MetadataTable::Make(source_table_, MetadataTable::Kind::kSnapshots); |
83 | | - EXPECT_THAT(snapshots_table_result, IsOk()); |
84 | | - snapshots_table_ = std::move(*snapshots_table_result); |
| 47 | + TableIdentifier ident{.ns = Namespace{.levels = {"db"}}, .name = "source_table"}; |
| 48 | + ICEBERG_UNWRAP_OR_FAIL(table_, Table::Make(ident, metadata, "s3://bucket/meta.json", |
| 49 | + std::make_shared<MockFileIO>(), |
| 50 | + std::make_shared<MockCatalog>())); |
85 | 51 | } |
86 | 52 |
|
87 | | - std::shared_ptr<MockFileIO> io_; |
88 | | - std::shared_ptr<MockCatalog> catalog_; |
89 | | - std::shared_ptr<TableMetadata> metadata_; |
90 | | - std::shared_ptr<Table> source_table_; |
91 | | - std::unique_ptr<MetadataTable> snapshots_table_; |
| 53 | + std::shared_ptr<Table> table_; |
92 | 54 | }; |
93 | 55 |
|
94 | | -TEST_F(MetadataTableTest, Constructor) { |
95 | | - EXPECT_EQ(snapshots_table_->kind(), MetadataTable::Kind::kSnapshots); |
96 | | - EXPECT_EQ(snapshots_table_->source_table(), source_table_); |
97 | | - EXPECT_EQ(snapshots_table_->name().name, "source_table.snapshots"); |
98 | | - EXPECT_EQ(snapshots_table_->name().ns.levels, (std::vector<std::string>{"db"})); |
99 | | - EXPECT_NE(snapshots_table_->schema(), nullptr); |
100 | | -} |
101 | | - |
102 | | -TEST_F(MetadataTableTest, SnapshotsSchemaMatchesIcebergSchema) { |
103 | | - EXPECT_TRUE(*snapshots_table_->schema() == *MakeSnapshotsSchema()); |
104 | | -} |
105 | | - |
106 | | -TEST_F(MetadataTableTest, HistorySchemaMatchesIcebergSchema) { |
107 | | - auto history_table_result = |
108 | | - MetadataTable::Make(source_table_, MetadataTable::Kind::kHistory); |
109 | | - ASSERT_THAT(history_table_result, IsOk()); |
110 | | - |
111 | | - EXPECT_TRUE(*(*history_table_result)->schema() == *MakeHistorySchema()); |
112 | | -} |
113 | | - |
114 | 56 | TEST_F(MetadataTableTest, FactoryRejectsNullSourceTable) { |
115 | 57 | auto result = MetadataTable::Make(nullptr, MetadataTable::Kind::kSnapshots); |
116 | 58 | EXPECT_THAT(result, IsError(ErrorKind::kInvalidArgument)); |
117 | 59 | EXPECT_THAT(result, HasErrorMessage("Table cannot be null")); |
118 | 60 | } |
119 | 61 |
|
| 62 | +TEST_F(MetadataTableTest, SupportsTimeTravel) { |
| 63 | + ICEBERG_UNWRAP_OR_FAIL(auto snapshots_table, |
| 64 | + MetadataTable::Make(table_, MetadataTable::Kind::kSnapshots)); |
| 65 | + EXPECT_FALSE(snapshots_table->supports_time_travel()); |
| 66 | + |
| 67 | + ICEBERG_UNWRAP_OR_FAIL(auto history_table, |
| 68 | + MetadataTable::Make(table_, MetadataTable::Kind::kHistory)); |
| 69 | + EXPECT_FALSE(history_table->supports_time_travel()); |
| 70 | +} |
| 71 | + |
120 | 72 | } // namespace iceberg |
0 commit comments