use super::*;
use tempfile::NamedTempFile;
#[test]
fn test_write_and_read_roundtrip() {
let temp_file = NamedTempFile::new().unwrap();
let path = temp_file.path().to_str().unwrap();
let test_strings = vec![
r#"{"name": "Alice", "age": 30}"#.to_string(),
r#"{"name": "Bob", "age": 25}"#.to_string(),
];
write_string_column(path, "json_data", test_strings.clone(), None).unwrap();
let result = read_string_column(path, "json_data").unwrap();
assert_eq!(result, test_strings);
}
#[test]
fn test_read_nonexistent_column() {
let temp_file = NamedTempFile::new().unwrap();
let path = temp_file.path().to_str().unwrap();
let test_strings = vec!["test".to_string()];
write_string_column(path, "data", test_strings, None).unwrap();
let result = read_string_column(path, "wrong_name");
assert!(result.is_err());
assert!(result.unwrap_err().contains("not found"));
}
#[test]
fn test_write_and_read_with_metadata() {
let temp_file = NamedTempFile::new().unwrap();
let path = temp_file.path().to_str().unwrap();
let test_strings = vec![
r#"{"name": "Alice"}"#.to_string(),
r#"{"name": "Bob"}"#.to_string(),
];
let mut metadata = HashMap::new();
metadata.insert("test_key".to_string(), "test_value".to_string());
metadata.insert("schema_version".to_string(), "1.0".to_string());
write_string_column(path, "data", test_strings.clone(), Some(metadata.clone())).unwrap();
let result_strings = read_string_column(path, "data").unwrap();
assert_eq!(result_strings, test_strings);
let result_metadata = read_parquet_metadata(path).unwrap();
assert_eq!(result_metadata.get("test_key"), Some(&"test_value".to_string()));
assert_eq!(result_metadata.get("schema_version"), Some(&"1.0".to_string()));
}
#[test]
fn test_write_without_metadata_read_empty_metadata() {
let temp_file = NamedTempFile::new().unwrap();
let path = temp_file.path().to_str().unwrap();
let test_strings = vec!["test".to_string()];
write_string_column(path, "data", test_strings, None).unwrap();
let metadata = read_parquet_metadata(path).unwrap();
assert!(metadata.is_empty());
}
#[test]
#[ignore]
fn test_large_string_array_automatic_selection() {
let temp_file = NamedTempFile::new().unwrap();
let path = temp_file.path().to_str().unwrap();
let large_string = "a".repeat(1_000_000); let count = 3000; let test_strings: Vec<String> = (0..count).map(|_| large_string.clone()).collect();
write_string_column(path, "large_data", test_strings.clone(), None).unwrap();
let result = read_string_column(path, "large_data").unwrap();
assert_eq!(result.len(), count);
assert_eq!(result[0], test_strings[0]);
}
#[test]
fn test_metadata_with_complex_json_schema() {
let temp_file = NamedTempFile::new().unwrap();
let path = temp_file.path().to_str().unwrap();
let test_strings = vec![r#"{"a":1}"#.to_string()];
let complex_schema = r#"{"type":"object","properties":{"a":{"type":"integer"}}}"#;
let mut metadata = HashMap::new();
metadata.insert("genson_avro_schema".to_string(), complex_schema.to_string());
metadata.insert("genson_normalise_config".to_string(), r#"{"empty_as_null":true,"coerce_string":false,"map_encoding":"kv","wrap_root":null}"#.to_string());
write_string_column(path, "data", test_strings, Some(metadata.clone())).unwrap();
let result_metadata = read_parquet_metadata(path).unwrap();
assert_eq!(result_metadata.get("genson_avro_schema"), Some(&complex_schema.to_string()));
let schema_json = result_metadata.get("genson_avro_schema").unwrap();
let parsed: serde_json::Value = serde_json::from_str(schema_json).unwrap();
assert_eq!(parsed["type"], "object");
}
#[test]
fn test_null_rows_and_kept_columns_roundtrip() {
let src = NamedTempFile::new().unwrap();
let src_path = src.path().to_str().unwrap();
let ids: ArrayRef = Arc::new(StringArray::from(vec!["Q1", "Q2", "Q3"]));
let id_field: FieldRef = Arc::new(Field::new("id", DataType::Utf8, true));
let strings = vec![Some(r#"{"a": 1}"#.to_string()), None, Some("{}".to_string())];
let keep = vec![(id_field, ids.clone())];
write_string_column_with(src_path, "json", strings.clone(), &keep, None).unwrap();
assert_eq!(read_string_column_opt(src_path, "json").unwrap(), strings);
assert_eq!(read_string_column(src_path, "json").unwrap().len(), 2);
let kept = read_columns(src_path, &["id".to_string()]).unwrap();
assert_eq!(kept.len(), 1);
assert_eq!(kept[0].0.name(), "id");
assert_eq!(kept[0].1.as_ref(), ids.as_ref());
let out = NamedTempFile::new().unwrap();
let short = vec![(kept[0].0.clone(), kept[0].1.slice(0, 2))];
let err = write_string_column_with(out.path().to_str().unwrap(), "json", strings, &short, None);
assert!(err.unwrap_err().contains("has 2 rows"));
}