From 6d0bb82bd270abc7ba3dc6a5ef383536eadd3270 Mon Sep 17 00:00:00 2001 From: Nigel Andrews Date: Tue, 4 Oct 2022 12:07:01 +0200 Subject: [PATCH 1/4] Fix issue 1576: serialize bytes as base64 strings --- src/schema/value.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/schema/value.rs b/src/schema/value.rs index bcfcfb74b..3b6d4598a 100644 --- a/src/schema/value.rs +++ b/src/schema/value.rs @@ -48,7 +48,7 @@ impl Serialize for Value { Value::Bool(b) => serializer.serialize_bool(b), Value::Date(ref date) => time::serde::rfc3339::serialize(&date.into_utc(), serializer), Value::Facet(ref facet) => facet.serialize(serializer), - Value::Bytes(ref bytes) => serializer.serialize_bytes(bytes), + Value::Bytes(ref bytes) => String::serialize(&base64::encode(bytes), serializer), Value::JsonObject(ref obj) => obj.serialize(serializer), } } @@ -451,6 +451,23 @@ mod tests { use crate::time::format_description::well_known::Rfc3339; use crate::time::OffsetDateTime; use crate::DateTime; + use crate::Document; + use crate::schema::{BytesOptions, Schema}; + + #[test] + fn test_parse_bytes_doc() { + let mut schema_builder = Schema::builder(); + let bytes_options = BytesOptions::default(); + let bytes_field = schema_builder.add_bytes_field("my_bytes", bytes_options); + let schema = schema_builder.build(); + let mut doc = Document::default(); + doc.add_bytes(bytes_field, "this is a test".as_bytes()); + let json_string = schema.to_json(&doc); + assert_eq!( + json_string, + "{\"my_bytes\":\"dGhpcyBpcyBhIHRlc3Q=\"}" + ); + } #[test] fn test_serialize_date() { From e5043d78d226693c54a76e3a43eae0f9f18b1dcb Mon Sep 17 00:00:00 2001 From: Nigel Andrews Date: Tue, 4 Oct 2022 12:52:44 +0200 Subject: [PATCH 2/4] added a couple of tests + make fmt --- src/schema/value.rs | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/schema/value.rs b/src/schema/value.rs index 3b6d4598a..0dfaaf731 100644 --- a/src/schema/value.rs +++ b/src/schema/value.rs @@ -448,11 +448,10 @@ mod binary_serialize { #[cfg(test)] mod tests { use super::Value; + use crate::schema::{BytesOptions, Schema}; use crate::time::format_description::well_known::Rfc3339; use crate::time::OffsetDateTime; - use crate::DateTime; - use crate::Document; - use crate::schema::{BytesOptions, Schema}; + use crate::{DateTime, Document}; #[test] fn test_parse_bytes_doc() { @@ -463,9 +462,36 @@ mod tests { let mut doc = Document::default(); doc.add_bytes(bytes_field, "this is a test".as_bytes()); let json_string = schema.to_json(&doc); + assert_eq!(json_string, "{\"my_bytes\":[\"dGhpcyBpcyBhIHRlc3Q=\"]}"); + } + + #[test] + fn test_parse_empty_bytes_doc() { + let mut schema_builder = Schema::builder(); + let bytes_options = BytesOptions::default(); + let bytes_field = schema_builder.add_bytes_field("my_bytes", bytes_options); + let schema = schema_builder.build(); + let mut doc = Document::default(); + doc.add_bytes(bytes_field, "".as_bytes()); + let json_string = schema.to_json(&doc); + assert_eq!(json_string, "{\"my_bytes\":[\"\"]}"); + } + + #[test] + fn test_parse_many_bytes_doc() { + let mut schema_builder = Schema::builder(); + let bytes_options = BytesOptions::default(); + let bytes_field = schema_builder.add_bytes_field("my_bytes", bytes_options); + let schema = schema_builder.build(); + let mut doc = Document::default(); + doc.add_bytes( + bytes_field, + "A bigger test I guess\nspanning on multiple lines\nhoping this will work".as_bytes(), + ); + let json_string = schema.to_json(&doc); assert_eq!( json_string, - "{\"my_bytes\":\"dGhpcyBpcyBhIHRlc3Q=\"}" + "{\"my_bytes\":[\"QSBiaWdnZXIgdGVzdCBJIGd1ZXNzCnNwYW5uaW5nIG9uIG11bHRpcGxlIGxpbmVzCmhvcGluZyB0aGlzIHdpbGwgd29yaw==\"]}" ); } From 00a6586efed48b4f83d37c663a98fe052c466c95 Mon Sep 17 00:00:00 2001 From: Nigel Andrews Date: Fri, 7 Oct 2022 11:45:09 +0200 Subject: [PATCH 3/4] Replaced String::serialize for serializer.serialize_str --- src/schema/value.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/schema/value.rs b/src/schema/value.rs index 0dfaaf731..b7fd73808 100644 --- a/src/schema/value.rs +++ b/src/schema/value.rs @@ -48,7 +48,7 @@ impl Serialize for Value { Value::Bool(b) => serializer.serialize_bool(b), Value::Date(ref date) => time::serde::rfc3339::serialize(&date.into_utc(), serializer), Value::Facet(ref facet) => facet.serialize(serializer), - Value::Bytes(ref bytes) => String::serialize(&base64::encode(bytes), serializer), + Value::Bytes(ref bytes) => serializer.serialize_str(&base64::encode(bytes)), Value::JsonObject(ref obj) => obj.serialize(serializer), } } From 3b189080d49d9b448d2bad68f8eb41268b1ead1d Mon Sep 17 00:00:00 2001 From: Nigel Andrews Date: Fri, 7 Oct 2022 12:28:25 +0200 Subject: [PATCH 4/4] Use raw string literals in tests --- src/schema/value.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/schema/value.rs b/src/schema/value.rs index b7fd73808..5caec3ca0 100644 --- a/src/schema/value.rs +++ b/src/schema/value.rs @@ -462,7 +462,7 @@ mod tests { let mut doc = Document::default(); doc.add_bytes(bytes_field, "this is a test".as_bytes()); let json_string = schema.to_json(&doc); - assert_eq!(json_string, "{\"my_bytes\":[\"dGhpcyBpcyBhIHRlc3Q=\"]}"); + assert_eq!(json_string, r#"{"my_bytes":["dGhpcyBpcyBhIHRlc3Q="]}"#); } #[test] @@ -474,7 +474,7 @@ mod tests { let mut doc = Document::default(); doc.add_bytes(bytes_field, "".as_bytes()); let json_string = schema.to_json(&doc); - assert_eq!(json_string, "{\"my_bytes\":[\"\"]}"); + assert_eq!(json_string, r#"{"my_bytes":[""]}"#); } #[test] @@ -491,7 +491,7 @@ mod tests { let json_string = schema.to_json(&doc); assert_eq!( json_string, - "{\"my_bytes\":[\"QSBiaWdnZXIgdGVzdCBJIGd1ZXNzCnNwYW5uaW5nIG9uIG11bHRpcGxlIGxpbmVzCmhvcGluZyB0aGlzIHdpbGwgd29yaw==\"]}" + r#"{"my_bytes":["QSBiaWdnZXIgdGVzdCBJIGd1ZXNzCnNwYW5uaW5nIG9uIG11bHRpcGxlIGxpbmVzCmhvcGluZyB0aGlzIHdpbGwgd29yaw=="]}"# ); }