fix(extractors): normalize uppercase JSON field names

Closes #6385
This commit is contained in:
t8y2
2026-08-17 06:10:10 +00:00
parent 84e834aab9
commit 736ebbdd69
2 changed files with 59 additions and 10 deletions
@@ -143,7 +143,7 @@ fn unique_json_names(
fn lower_camel_json_name(name: &str) -> String {
if !name.contains('_') {
return name.to_owned();
return if name.chars().any(char::is_lowercase) { name.to_owned() } else { name.to_lowercase() };
}
let mut words = name.split('_').filter(|word| !word.is_empty());
@@ -355,26 +355,60 @@ fn extracts_compact_json_when_pretty_printing_is_disabled() {
fn converts_snake_case_json_field_names_only_when_enabled() {
let mut request = request(DataGridExtractorId::Json);
request.columns = vec![
column("user_id", 0),
column("ORDER_ITEM_ID", 1),
column("alreadyCamel", 2),
column("_display__name_", 3),
column("naïve_value", 4),
column("ID", 0),
column("CODE", 1),
column("NAME", 2),
column("CREATE_TIME", 3),
column("user_id", 4),
column("ORDER_ITEM_ID", 5),
column("alreadyCamel", 6),
column("_display__name_", 7),
column("naïve_value", 8),
];
request.selected_column_indexes = vec![0, 1, 2, 3, 4];
request.rows = vec![vec![json!(7), json!(9), json!("kept"), json!("Ada"), json!(true)]];
request.selected_column_indexes = vec![0, 1, 2, 3, 4, 5, 6, 7, 8];
request.rows = vec![vec![
json!(1),
json!("A01"),
json!("Ada"),
json!("2026-08-16T08:52:23Z"),
json!(7),
json!(9),
json!("kept"),
json!("Ada"),
json!(true),
]];
let unchanged = extract_data_grid_selection(request.clone()).expect("default JSON extraction");
assert_eq!(
serde_json::from_str::<Value>(&unchanged.text).expect("valid default JSON"),
json!([{"user_id": 7, "ORDER_ITEM_ID": 9, "alreadyCamel": "kept", "_display__name_": "Ada", "naïve_value": true}])
json!([{
"ID": 1,
"CODE": "A01",
"NAME": "Ada",
"CREATE_TIME": "2026-08-16T08:52:23Z",
"user_id": 7,
"ORDER_ITEM_ID": 9,
"alreadyCamel": "kept",
"_display__name_": "Ada",
"naïve_value": true
}])
);
request.options.json.camel_case_field_names = true;
let converted = extract_data_grid_selection(request).expect("camel-case JSON extraction");
assert_eq!(
serde_json::from_str::<Value>(&converted.text).expect("valid converted JSON"),
json!([{"userId": 7, "orderItemId": 9, "alreadyCamel": "kept", "displayName": "Ada", "naïveValue": true}])
json!([{
"id": 1,
"code": "A01",
"name": "Ada",
"createTime": "2026-08-16T08:52:23Z",
"userId": 7,
"orderItemId": 9,
"alreadyCamel": "kept",
"displayName": "Ada",
"naïveValue": true
}])
);
}
@@ -401,6 +435,21 @@ fn converts_json_lines_names_and_suffixes_post_conversion_collisions() {
assert_eq!(result.warnings[0].code, DataGridExtractWarningCode::DuplicateJsonColumnNames);
}
#[test]
fn suffixes_collisions_after_normalizing_uppercase_json_names() {
let mut request = request(DataGridExtractorId::Json);
request.columns = vec![column("ID", 0), column("id", 1)];
request.selected_column_indexes = vec![0, 1];
request.rows = vec![vec![json!(1), json!(2)]];
request.options.json.camel_case_field_names = true;
let result = extract_data_grid_selection(request).expect("normalized JSON extraction");
assert_eq!(serde_json::from_str::<Value>(&result.text).expect("valid JSON"), json!([{"id": 1, "id_2": 2}]));
assert_eq!(result.warnings.len(), 1);
assert_eq!(result.warnings[0].code, DataGridExtractWarningCode::DuplicateJsonColumnNames);
}
#[test]
fn builds_null_safe_where_clause_predicates() {
let mut request = request(DataGridExtractorId::WhereClause);