use std::sync::Arc;
use buoyant_kernel as delta_kernel;
use delta_kernel::committer::FileSystemCommitter;
use delta_kernel::schema::{
ArrayType, ColumnMetadataKey, DataType, MapType, StructField, StructType,
};
use delta_kernel::snapshot::Snapshot;
use delta_kernel::table_features::{ColumnMappingMode, TableFeature};
use delta_kernel::transaction::create_table::create_table;
use delta_kernel::DeltaResult;
use rstest::rstest;
use test_utils::test_table_setup;
#[rstest]
#[case::cm_mode_none(
&[("delta.columnMapping.mode", "none")],
"to be 'name' or 'id', got 'none'",
)]
#[case::row_tracking_disabled(
&[("delta.enableRowTracking", "false")],
"to be 'true', got 'false'",
)]
#[case::iceberg_compat_v1_active(
&[("delta.enableIcebergCompatV1", "true")],
"Setting delta property 'delta.enableIcebergCompatV1' is not supported",
)]
#[case::iceberg_compat_v2_active(
&[("delta.enableIcebergCompatV2", "true")],
"Setting delta property 'delta.enableIcebergCompatV2' is not supported",
)]
fn v3_create_table_rejects_incompatible_props(
#[case] extra_props: &[(&str, &str)],
#[case] err_substring: &str,
) -> DeltaResult<()> {
let (_temp_dir, table_path, engine) = test_table_setup()?;
let mut props: Vec<(&str, &str)> = vec![("delta.enableIcebergCompatV3", "true")];
props.extend_from_slice(extra_props);
let err = create_table(&table_path, super::simple_schema()?, "Test/1.0")
.with_table_properties(props)
.build(engine.as_ref(), Box::new(FileSystemCommitter::new()))
.unwrap_err()
.to_string();
assert!(
err.contains(err_substring),
"expected error containing {err_substring:?}, got: {err}",
);
Ok(())
}
#[test]
fn v3_supported_but_not_enabled_skips_cm_and_nested_ids() -> DeltaResult<()> {
let (_temp_dir, table_path, engine) = test_table_setup()?;
let schema = Arc::new(StructType::try_new(vec![StructField::nullable(
"data",
DataType::Map(Box::new(MapType::new(
DataType::INTEGER,
DataType::Array(Box::new(ArrayType::new(DataType::INTEGER, true))),
true,
))),
)])?);
let _ = create_table(&table_path, schema, "Test/1.0")
.with_table_properties([("delta.feature.icebergCompatV3", "supported")])
.build(engine.as_ref(), Box::new(FileSystemCommitter::new()))?
.commit(engine.as_ref())?;
let snapshot = Snapshot::builder_for(&table_path).build(engine.as_ref())?;
let writer_features = snapshot
.table_configuration()
.protocol()
.writer_features()
.expect("writerFeatures present");
assert!(
writer_features.contains(&TableFeature::IcebergCompatV3),
"expected icebergCompatV3 in writerFeatures, got: {writer_features:?}",
);
assert_eq!(
snapshot.table_configuration().column_mapping_mode(),
ColumnMappingMode::None,
);
let loaded_schema = snapshot.schema();
let data_field = loaded_schema.field("data").expect("data field present");
assert!(
!data_field
.metadata
.contains_key(ColumnMetadataKey::ColumnMappingNestedIds.as_ref()),
"unexpected delta.columnMapping.nested.ids on data: {:?}",
data_field.metadata,
);
Ok(())
}