@@ -828,6 +828,40 @@ def test_update_metadata_add_snapshot(table_v2: Table) -> None:
828828 assert new_metadata .last_updated_ms == new_snapshot .timestamp_ms
829829
830830
831+ def test_update_metadata_add_snapshot_rejects_old_timestamp_vs_snapshot_log (table_v2 : Table ) -> None :
832+ oldest_allowed_snapshot_ts = table_v2 .metadata .snapshot_log [- 1 ].timestamp_ms - 60_000
833+ new_snapshot = Snapshot (
834+ snapshot_id = 25 ,
835+ parent_snapshot_id = 19 ,
836+ sequence_number = 200 ,
837+ timestamp_ms = oldest_allowed_snapshot_ts - 1 ,
838+ manifest_list = "s3:/a/b/c.avro" ,
839+ summary = Summary (Operation .APPEND ),
840+ schema_id = 3 ,
841+ )
842+
843+ with pytest .raises (ValueError , match = "before last snapshot timestamp" ):
844+ update_table_metadata (table_v2 .metadata , (AddSnapshotUpdate (snapshot = new_snapshot ),))
845+
846+
847+ def test_update_metadata_add_snapshot_rejects_old_timestamp_vs_last_updated (table_v2 : Table ) -> None :
848+ # Clear snapshot-log to isolate the last_updated_ms guard.
849+ base_metadata = table_v2 .metadata .model_copy (update = {"snapshot_log" : []})
850+ oldest_allowed_snapshot_ts = base_metadata .last_updated_ms - 60_000
851+ new_snapshot = Snapshot (
852+ snapshot_id = 25 ,
853+ parent_snapshot_id = 19 ,
854+ sequence_number = 200 ,
855+ timestamp_ms = oldest_allowed_snapshot_ts - 1 ,
856+ manifest_list = "s3:/a/b/c.avro" ,
857+ summary = Summary (Operation .APPEND ),
858+ schema_id = 3 ,
859+ )
860+
861+ with pytest .raises (ValueError , match = "before last updated timestamp" ):
862+ update_table_metadata (base_metadata , (AddSnapshotUpdate (snapshot = new_snapshot ),))
863+
864+
831865def test_update_metadata_set_ref_snapshot (table_v2 : Table ) -> None :
832866 update , _ = table_v2 .transaction ()._set_ref_snapshot (
833867 snapshot_id = 3051729675574597004 ,
0 commit comments