Skip to content

Commit be0b31a

Browse files
committed
test: override_inferred_data_type
1 parent e5c2493 commit be0b31a

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed

src/event/format/json.rs

+127
Original file line numberDiff line numberDiff line change
@@ -472,4 +472,131 @@ mod tests {
472472

473473
assert!(parsed.is_err());
474474
}
475+
476+
#[test]
477+
fn updates_field_type_to_timestamp_for_time_related_fields() {
478+
let fields = Fields::from(vec![Field::new("created_time", DataType::Utf8, true)]);
479+
let mut schema = Schema::new(fields);
480+
481+
// Create a JSON log record with a time field in RFC3339 format
482+
let log_record = serde_json::json!({
483+
"created_time": "2023-01-01T12:00:00Z"
484+
});
485+
486+
// Call the function to override the inferred data type
487+
override_inferred_data_type(&mut schema, &log_record, SchemaVersion::V1);
488+
489+
// Check that the field type was updated to Timestamp
490+
let updated_field = schema.field(0);
491+
assert_eq!(
492+
updated_field.data_type(),
493+
&DataType::Timestamp(TimeUnit::Millisecond, None)
494+
);
495+
assert_eq!(updated_field.name(), "created_time");
496+
}
497+
498+
#[test]
499+
fn update_field_type_to_timestamp_for_rfc2822_format() {
500+
let fields = Fields::from(vec![Field::new("event_time", DataType::Utf8, true)]);
501+
let mut schema = Schema::new(fields);
502+
503+
// Create a JSON log record with a time field in RFC2822 format
504+
let log_record = serde_json::json!({
505+
"event_time": "Wed, 02 Oct 2002 15:00:00 +0200"
506+
});
507+
508+
// Call the function to override the inferred data type
509+
override_inferred_data_type(&mut schema, &log_record, SchemaVersion::V1);
510+
511+
// Check that the field type was updated to Timestamp
512+
let updated_field = schema.field(0);
513+
assert_eq!(
514+
updated_field.data_type(),
515+
&DataType::Timestamp(TimeUnit::Millisecond, None)
516+
);
517+
assert_eq!(updated_field.name(), "event_time");
518+
}
519+
520+
#[test]
521+
fn update_numeric_fields_to_float64() {
522+
let fields = Fields::from(vec![Field::new("numeric_field", DataType::Int32, true)]);
523+
let mut schema = Schema::new(fields);
524+
525+
// Create a JSON log record with a numeric field
526+
let log_record = serde_json::json!({
527+
"numeric_field": 42
528+
});
529+
530+
// Call the function to override the inferred data type
531+
override_inferred_data_type(&mut schema, &log_record, SchemaVersion::V1);
532+
533+
// Check that the field type was updated to Float64
534+
let updated_field = schema.field(0);
535+
assert_eq!(updated_field.data_type(), &DataType::Float64);
536+
assert_eq!(updated_field.name(), "numeric_field");
537+
}
538+
539+
#[test]
540+
fn handle_non_standard_time_strings() {
541+
let fields = Fields::from(vec![Field::new("event_time", DataType::Utf8, true)]);
542+
let mut schema = Schema::new(fields);
543+
544+
// Create a JSON log record with a non-standard time format
545+
let log_record = serde_json::json!({
546+
"event_time": "01-01-2023 12:00:00"
547+
});
548+
549+
// Call the function to override the inferred data type
550+
override_inferred_data_type(&mut schema, &log_record, SchemaVersion::V1);
551+
552+
// Check that the field type was not updated to Timestamp
553+
let updated_field = schema.field(0);
554+
assert_eq!(updated_field.data_type(), &DataType::Utf8);
555+
assert_eq!(updated_field.name(), "event_time");
556+
}
557+
558+
#[test]
559+
fn handles_numeric_fields_already_float64() {
560+
let fields = Fields::from(vec![Field::new("numeric_value", DataType::Float64, true)]);
561+
let mut schema = Schema::new(fields);
562+
563+
// Create a JSON log record with a numeric field
564+
let log_record = serde_json::json!({
565+
"numeric_value": 42.0
566+
});
567+
568+
// Call the function to override the inferred data type
569+
override_inferred_data_type(&mut schema, &log_record, SchemaVersion::V1);
570+
571+
// Check that the field type remains Float64
572+
let updated_field = schema.field(0);
573+
assert_eq!(updated_field.data_type(), &DataType::Float64);
574+
assert_eq!(updated_field.name(), "numeric_value");
575+
}
576+
577+
#[test]
578+
fn does_not_update_field_type_for_v0_schema_version() {
579+
let fields = Fields::from(vec![
580+
Field::new("event_time", DataType::Utf8, true),
581+
Field::new("numeric_field", DataType::Int32, true),
582+
]);
583+
let mut schema = Schema::new(fields);
584+
585+
// Create a JSON log record with a string field
586+
let log_record = serde_json::json!({
587+
"event_time": "01-01-2023 12:00:00",
588+
"numeric_field": 42
589+
});
590+
591+
// Call the function to override the inferred data type with a non-V1 schema version
592+
override_inferred_data_type(&mut schema, &log_record, SchemaVersion::V0);
593+
594+
// Check that the field type was not updated
595+
let updated_field = schema.field(0);
596+
assert_eq!(updated_field.data_type(), &DataType::Utf8);
597+
assert_eq!(updated_field.name(), "event_time");
598+
let updated_field = schema.field(1);
599+
assert_eq!(updated_field.data_type(), &DataType::Int32);
600+
assert_eq!(updated_field.name(), "numeric_field");
601+
}
475602
}

0 commit comments

Comments
 (0)