From 6878fca62a241f9c3337b3fb403ad7410f55d5d7 Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Wed, 14 Feb 2018 15:32:01 +0000 Subject: [PATCH] Added ArangoJsonTextReader to ensure common handling for date parsing (and other settings) Added unit tests for DocuemntParser single result date parsing --- src/ArangoDB.Client.Test/Model/DateJson.cs | 20 +++++ src/ArangoDB.Client.Test/Model/DateModel.cs | 14 +++ .../Serialization/SimpleDocumentParser.cs | 90 ++++++++++++++++--- .../Cursor/CursorAsyncEnumerator.cs | 3 +- .../Serialization/ArangoJsonTextReader.cs | 13 +++ .../Serialization/DocumentSerializer.cs | 14 ++- 6 files changed, 133 insertions(+), 21 deletions(-) create mode 100644 src/ArangoDB.Client.Test/Model/DateJson.cs create mode 100644 src/ArangoDB.Client.Test/Model/DateModel.cs create mode 100644 src/ArangoDB.Client/Serialization/ArangoJsonTextReader.cs diff --git a/src/ArangoDB.Client.Test/Model/DateJson.cs b/src/ArangoDB.Client.Test/Model/DateJson.cs new file mode 100644 index 0000000..03945fe --- /dev/null +++ b/src/ArangoDB.Client.Test/Model/DateJson.cs @@ -0,0 +1,20 @@ +namespace ArangoDB.Client.Test.Model +{ + public class DateJson + { + public static string SingleDateModelResult => @" +{ +'IsoDateAsString':'1983-10-20', +'IsoDateAsDateTime':'1983-10-20', +'IsoDateTimeAsString':'2017-11-16T00:00:00Z', +'IsoDateTimeAsDateTime':'2017-11-16T02:30:15Z', +'IsoDateTimeAsDateTimeOffset':'2017-11-16T01:00:00Z', +'IsoDateTimeWithOffsetAsDateTimeOffset':'2018-02-14T13:43:12+02:30', +'_id':'DateModel/KEY', +'_rev':'REV', +'_key':'KEY' +} +"; + } +} + \ No newline at end of file diff --git a/src/ArangoDB.Client.Test/Model/DateModel.cs b/src/ArangoDB.Client.Test/Model/DateModel.cs new file mode 100644 index 0000000..293ff9c --- /dev/null +++ b/src/ArangoDB.Client.Test/Model/DateModel.cs @@ -0,0 +1,14 @@ +using System; + +namespace ArangoDB.Client.Test.Model +{ + public class DateModel + { + public string IsoDateAsString { get; set; } + public DateTime IsoDateAsDateTime { get; set; } + public string IsoDateTimeAsString { get; set; } + public DateTime IsoDateTimeAsDateTime { get; set; } + public DateTimeOffset IsoDateTimeAsDateTimeOffset { get; set; } + public DateTimeOffset IsoDateTimeWithOffsetAsDateTimeOffset { get; set; } + } +} \ No newline at end of file diff --git a/src/ArangoDB.Client.Test/Serialization/SimpleDocumentParser.cs b/src/ArangoDB.Client.Test/Serialization/SimpleDocumentParser.cs index b878548..eba1b56 100644 --- a/src/ArangoDB.Client.Test/Serialization/SimpleDocumentParser.cs +++ b/src/ArangoDB.Client.Test/Serialization/SimpleDocumentParser.cs @@ -4,11 +4,7 @@ using ArangoDB.Client.Serialization; using ArangoDB.Client.Test.Model; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Xunit; namespace ArangoDB.Client.Test.Serialization @@ -24,26 +20,98 @@ JsonTextReader GenerateReader(string json) stream.Position = 0; var streamReader = new StreamReader(stream); - return new JsonTextReader(streamReader); + return new ArangoJsonTextReader(streamReader); } - - [Fact] - public void ParseSingle() + public void ParseSingleResult(string value, Action assert) { - using (var reader = GenerateReader(JsonSample.SingleResult)) + using (var reader = GenerateReader(value)) { var documentParser = new DocumentParser(new ArangoDatabase()); JObject jObject = null; - var person = documentParser.ParseSingleResult(reader, out jObject, true); + var result = documentParser.ParseSingleResult(reader, out jObject, true); + + assert(jObject, result); + } + } + [Fact] + public void ParseSingle() + { + ParseSingleResult(JsonSample.SingleResult, (jObject, person) => + { Assert.Equal(27, person.Age); Assert.Equal("raoof hojat", person.Fullname); Assert.Equal(172, person.Height); Assert.True(JObject.DeepEquals(jObject, JObject.Parse(JsonSample.SingleResult))); - } + }); + } + + + [Fact] + public void ParseSingle_IsoDate_ToString() + { + ParseSingleResult(DateJson.SingleDateModelResult, (jObject, result) => + { + // ISO Date to String + Assert.Equal(JTokenType.String, jObject["IsoDateAsString"].Type); + Assert.Equal("1983-10-20", result.IsoDateAsString); + + }); + } + + [Fact] + public void ParseSingle_IsoDate_ToDateTime() + { + ParseSingleResult(DateJson.SingleDateModelResult, (jObject, result) => + { + Assert.Equal(JTokenType.String, jObject["IsoDateAsDateTime"].Type); + Assert.Equal(new DateTime(1983, 10, 20), result.IsoDateAsDateTime); + + }); + } + + [Fact] + public void ParseSingle_IsoDateTime_ToString() + { + ParseSingleResult(DateJson.SingleDateModelResult, (jObject, result) => + { + Assert.Equal(JTokenType.String, jObject["IsoDateTimeAsString"].Type); + Assert.Equal("2017-11-16T00:00:00Z", result.IsoDateTimeAsString); + + }); + } + + [Fact] + public void ParseSingle_IsoDateTimeInUtc_ToDateTimeUtcKind() + { + ParseSingleResult(DateJson.SingleDateModelResult, (jObject, result) => + { + Assert.Equal(new DateTime(2017, 11, 16, 02, 30, 15), result.IsoDateTimeAsDateTime); + Assert.Equal(DateTimeKind.Utc, result.IsoDateTimeAsDateTime.Kind); + + }); + } + + [Fact] + public void ParseSingle_IsoDateTimeInUtc_ToDateTimeOffset() + { + ParseSingleResult(DateJson.SingleDateModelResult, (jObject, result) => + { + Assert.Equal(new DateTimeOffset(2017, 11, 16, 01, 00, 00, TimeSpan.Zero), result.IsoDateTimeAsDateTimeOffset); + }); + } + + [Fact] + public void ParseSingle_IsoDateTimeWithOffset_ToDateTimeOffset() + { + ParseSingleResult(DateJson.SingleDateModelResult, (jObject, result) => + { + // "2018-02-14T13:43:12+02:30" + Assert.Equal(new DateTimeOffset(2018, 2, 14, 13, 43, 12, new TimeSpan(2,30,0)), result.IsoDateTimeWithOffsetAsDateTimeOffset); + }); } [Fact] diff --git a/src/ArangoDB.Client/Cursor/CursorAsyncEnumerator.cs b/src/ArangoDB.Client/Cursor/CursorAsyncEnumerator.cs index 8fc6df9..68f48da 100644 --- a/src/ArangoDB.Client/Cursor/CursorAsyncEnumerator.cs +++ b/src/ArangoDB.Client/Cursor/CursorAsyncEnumerator.cs @@ -60,8 +60,7 @@ async Task MakeNextRequest() stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); streamReader = new StreamReader(stream); - jsonTextReader = new JsonTextReader(streamReader); - jsonTextReader.DateParseHandling = DateParseHandling.None; + jsonTextReader = new ArangoJsonTextReader(streamReader); CursorResult.RequestCount++; } diff --git a/src/ArangoDB.Client/Serialization/ArangoJsonTextReader.cs b/src/ArangoDB.Client/Serialization/ArangoJsonTextReader.cs new file mode 100644 index 0000000..b7f3fb4 --- /dev/null +++ b/src/ArangoDB.Client/Serialization/ArangoJsonTextReader.cs @@ -0,0 +1,13 @@ +using System.IO; +using Newtonsoft.Json; + +namespace ArangoDB.Client.Serialization +{ + public class ArangoJsonTextReader : JsonTextReader + { + public ArangoJsonTextReader(TextReader reader) : base(reader) + { + this.DateParseHandling = DateParseHandling.None; + } + } +} diff --git a/src/ArangoDB.Client/Serialization/DocumentSerializer.cs b/src/ArangoDB.Client/Serialization/DocumentSerializer.cs index 8dc6d8d..64e08a4 100644 --- a/src/ArangoDB.Client/Serialization/DocumentSerializer.cs +++ b/src/ArangoDB.Client/Serialization/DocumentSerializer.cs @@ -15,6 +15,7 @@ namespace ArangoDB.Client.Serialization public class DocumentSerializer { IArangoDatabase db; + public DocumentSerializer(IArangoDatabase db) { this.db = db; @@ -23,11 +24,9 @@ public DocumentSerializer(IArangoDatabase db) public T Deserialize(Stream stream) { using (var streamReader = new StreamReader(stream)) - using (var jsonReader = new JsonTextReader(streamReader)) + using (var jsonReader = new ArangoJsonTextReader(streamReader)) { - var serializer = CreateJsonSerializer(); - - return serializer.Deserialize(jsonReader); + return Deserialize(jsonReader); } } @@ -41,7 +40,7 @@ public T Deserialize(JsonTextReader reader) public List DeserializeBatchResult(Stream stream, out BaseResult baseResult) { using (var streamReader = new StreamReader(stream)) - using (var jsonReader = new JsonTextReader(streamReader)) + using (var jsonReader = new ArangoJsonTextReader(streamReader)) { var serializer = CreateJsonSerializer(); return new DocumentParser(db).ParseBatchResult(jsonReader, out baseResult); @@ -51,7 +50,7 @@ public List DeserializeBatchResult(Stream stream, out BaseResult baseResul public T DeserializeSingleResult(Stream stream, out BaseResult baseResult) { using (var streamReader = new StreamReader(stream)) - using (var jsonReader = new JsonTextReader(streamReader)) + using (var jsonReader = new ArangoJsonTextReader(streamReader)) { var serializer = CreateJsonSerializer(); return new DocumentParser(db).ParseBatchResult(jsonReader, out baseResult).FirstOrDefault(); @@ -61,9 +60,8 @@ public T DeserializeSingleResult(Stream stream, out BaseResult baseResult) public T DeserializeSingleResult(Stream stream, out JObject jObject) { using (var streamReader = new StreamReader(stream)) - using (var jsonReader = new JsonTextReader(streamReader)) + using (var jsonReader = new ArangoJsonTextReader(streamReader)) { - var serializer = CreateJsonSerializer(); return new DocumentParser(db).ParseSingleResult(jsonReader, out jObject, true); } }