()
| 485 | |
| 486 | #[test] |
| 487 | fn encode_decode_json_column() { |
| 488 | let schema = StrictSchema::new(vec![ |
| 489 | ColumnDef::required("id", ColumnType::Int64).with_primary_key(), |
| 490 | ColumnDef::nullable("metadata", ColumnType::Json), |
| 491 | ]) |
| 492 | .unwrap(); |
| 493 | let encoder = TupleEncoder::new(&schema); |
| 494 | |
| 495 | let metadata = Value::Object(std::collections::HashMap::from([ |
| 496 | ("source".to_string(), Value::String("web".to_string())), |
| 497 | ("priority".to_string(), Value::Integer(3)), |
| 498 | ])); |
| 499 | let values = vec![Value::Integer(1), metadata.clone()]; |
| 500 | let tuple = encoder.encode(&values).unwrap(); |
| 501 | |
| 502 | // Tuple must be longer than just the header + fixed section. |
| 503 | // Header: 10 bytes. Fixed: 8 (Int64). Offset table: 8 (2 entries × u32). |
| 504 | // Variable data must be non-empty (MessagePack of the object). |
| 505 | let min_size = 10 + 8 + 8; |
| 506 | assert!(tuple.len() > min_size, "tuple should contain variable data"); |
| 507 | |
| 508 | // Decode and verify the value roundtrips correctly. |
| 509 | let decoder = crate::decode::TupleDecoder::new(&schema); |
| 510 | let decoded = decoder.extract_all(&tuple).unwrap(); |
| 511 | assert_eq!(decoded[0], Value::Integer(1)); |
| 512 | assert_eq!(decoded[1], metadata); |
| 513 | } |
| 514 | |
| 515 | #[test] |
| 516 | fn encode_json_null() { |
nothing calls this directly
no test coverage detected