Skip to content

Commit 8e65387

Browse files
committed
Merge branch 'enhancement/1.x-datetime-serialization' into 1.x
2 parents b9eff57 + 7bc02e9 commit 8e65387

File tree

7 files changed

+543
-109
lines changed

7 files changed

+543
-109
lines changed

src/Tests/Nest.Tests.Unit/Internals/Serialize/ConnectionSettingsTests.cs

Lines changed: 0 additions & 108 deletions
This file was deleted.
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
using System;
2+
using System.IO;
3+
using System.Text;
4+
using Elasticsearch.Net;
5+
using Newtonsoft.Json;
6+
using Newtonsoft.Json.Serialization;
7+
using NUnit.Framework;
8+
9+
namespace Nest.Tests.Unit.Internals.Serialize.DateTimes
10+
{
11+
public abstract class DateTimeHandlingTestsBase
12+
{
13+
protected Flight Flight;
14+
protected string LocalOffsetString;
15+
protected TimeSpan LocalOffset;
16+
17+
[SetUp]
18+
public void SetUp()
19+
{
20+
var departureDateLocal = new DateTime(2013, 1, 21, 0, 0, 0, DateTimeKind.Local);
21+
LocalOffset = TimeZoneInfo.Local.GetUtcOffset(departureDateLocal);
22+
23+
var departureDateUtc = new DateTime(2013, 1, 21, 0, 0, 0, DateTimeKind.Utc);
24+
25+
Flight = new Flight
26+
{
27+
DepartureDate = new DateTime(2013, 1, 21, 0, 0, 0, DateTimeKind.Unspecified),
28+
DepartureDateUtc = departureDateUtc,
29+
DepartureDateLocal = departureDateLocal,
30+
DepartureDateUtcWithTicks = departureDateUtc.AddTicks(3456789),
31+
DepartureDateOffset = new DateTimeOffset(2013, 1, 21, 0, 0, 0, LocalOffset),
32+
DepartureDateOffsetZero = new DateTimeOffset(2013, 1, 21, 0, 0, 0, TimeSpan.Zero),
33+
DepartureDateOffsetNonLocal = new DateTimeOffset(2013, 1, 21, 0, 0, 0, TimeSpan.FromHours(-6.25)),
34+
};
35+
36+
LocalOffsetString = string.Format("{0}:{1}",
37+
LocalOffset.Hours.ToString("+00;-00;"),
38+
LocalOffset.Minutes.ToString("00"));
39+
}
40+
41+
protected string SerializeUsing(
42+
DateTimeZoneHandling? handling = null,
43+
Func<IConnectionSettingsValues, IContractResolver> contractResolver = null)
44+
{
45+
var settings = new ConnectionSettings();
46+
47+
settings
48+
.SetDefaultPropertyNameInferrer(p => p)
49+
.SetJsonSerializerSettingsModifier(s =>
50+
{
51+
s.Formatting = Formatting.Indented;
52+
53+
if (handling.HasValue)
54+
s.DateTimeZoneHandling = handling.Value;
55+
56+
if (contractResolver != null)
57+
s.ContractResolver = contractResolver(settings);
58+
});
59+
60+
var client = new ElasticClient(settings);
61+
return client.Serializer.Serialize(Flight).Utf8String();
62+
}
63+
64+
protected Flight DeserializeUsing(
65+
string json,
66+
DateTimeZoneHandling? handling = null,
67+
Func<IConnectionSettingsValues, IContractResolver> contractResolver = null)
68+
{
69+
var settings = new ConnectionSettings();
70+
71+
settings
72+
.SetDefaultPropertyNameInferrer(p => p)
73+
.SetJsonSerializerSettingsModifier(s =>
74+
{
75+
if (handling.HasValue)
76+
s.DateTimeZoneHandling = handling.Value;
77+
78+
if (contractResolver != null)
79+
s.ContractResolver = contractResolver(settings);
80+
});
81+
82+
var client = new ElasticClient(settings);
83+
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
84+
{
85+
return client.Serializer.Deserialize<Flight>(stream);
86+
}
87+
}
88+
}
89+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System;
2+
using FluentAssertions;
3+
using NUnit.Framework;
4+
5+
namespace Nest.Tests.Unit.Internals.Serialize.DateTimes
6+
{
7+
/// <summary>
8+
/// Test for the default DateTime and DateTimeOffset serialization within NEST
9+
/// </summary>
10+
[TestFixture]
11+
public class DefaultDateTimeHandlingTests : DateTimeHandlingTestsBase
12+
{
13+
[Test]
14+
public void Default()
15+
{
16+
var jsonWithRoundtripTimeZone = this.SerializeUsing();
17+
var expected = @" {
18+
""DepartureDate"": ""2013-01-21T00:00:00"",
19+
""DepartureDateUtc"": ""2013-01-21T00:00:00Z"",
20+
""DepartureDateLocal"": ""2013-01-21T00:00:00" + LocalOffsetString + @""",
21+
""DepartureDateUtcWithTicks"": ""2013-01-21T00:00:00.3456789Z"",
22+
""DepartureDateOffset"": ""2013-01-21T00:00:00" + LocalOffsetString + @""",
23+
""DepartureDateOffsetZero"": ""2013-01-21T00:00:00+00:00"",
24+
""DepartureDateOffsetNonLocal"": ""2013-01-21T00:00:00-06:15""
25+
}";
26+
jsonWithRoundtripTimeZone.JsonEquals(expected).Should().BeTrue("{0}", jsonWithRoundtripTimeZone);
27+
28+
var flight = this.DeserializeUsing(jsonWithRoundtripTimeZone);
29+
30+
flight.Should().Be(Flight);
31+
flight.DepartureDate.Kind.Should().Be(Flight.DepartureDate.Kind);
32+
flight.DepartureDateLocal.Kind.Should().Be(Flight.DepartureDateLocal.Kind);
33+
flight.DepartureDateUtc.Kind.Should().Be(Flight.DepartureDateUtc.Kind);
34+
flight.DepartureDateUtcWithTicks.Kind.Should().Be(Flight.DepartureDateUtcWithTicks.Kind);
35+
flight.DepartureDateOffset.Offset.Should().Be(Flight.DepartureDateOffset.Offset);
36+
flight.DepartureDateOffsetZero.Offset.Should().Be(Flight.DepartureDateOffsetZero.Offset);
37+
flight.DepartureDateOffsetNonLocal.Offset.Should().Be(Flight.DepartureDateOffsetNonLocal.Offset);
38+
}
39+
}
40+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using System;
2+
3+
namespace Nest.Tests.Unit.Internals.Serialize.DateTimes
4+
{
5+
public class Flight
6+
{
7+
public DateTime DepartureDate { get; set; }
8+
public DateTime DepartureDateUtc { get; set; }
9+
public DateTime DepartureDateLocal { get; set; }
10+
public DateTime DepartureDateUtcWithTicks { get; set; }
11+
public DateTimeOffset DepartureDateOffset { get; set; }
12+
public DateTimeOffset DepartureDateOffsetZero { get; set; }
13+
public DateTimeOffset DepartureDateOffsetNonLocal { get; set; }
14+
15+
protected bool Equals(Flight other)
16+
{
17+
return DepartureDate.Ticks.Equals(other.DepartureDate.Ticks) &&
18+
DepartureDateUtc.Ticks.Equals(other.DepartureDateUtc.Ticks) &&
19+
DepartureDateLocal.Ticks.Equals(other.DepartureDateLocal.Ticks) &&
20+
DepartureDateUtcWithTicks.Ticks.Equals(other.DepartureDateUtcWithTicks.Ticks) &&
21+
DepartureDateOffset.Ticks.Equals(other.DepartureDateOffset.Ticks) &&
22+
DepartureDateOffsetZero.Ticks.Equals(other.DepartureDateOffsetZero.Ticks) &&
23+
DepartureDateOffsetNonLocal.Ticks.Equals(other.DepartureDateOffsetNonLocal.Ticks);
24+
}
25+
26+
public override bool Equals(object obj)
27+
{
28+
if (ReferenceEquals(null, obj)) return false;
29+
if (ReferenceEquals(this, obj)) return true;
30+
if (obj.GetType() != this.GetType()) return false;
31+
return Equals((Flight)obj);
32+
}
33+
34+
public override int GetHashCode()
35+
{
36+
unchecked
37+
{
38+
var hashCode = DepartureDate.GetHashCode();
39+
hashCode = (hashCode * 397) ^ DepartureDateUtc.GetHashCode();
40+
hashCode = (hashCode * 397) ^ DepartureDateLocal.GetHashCode();
41+
hashCode = (hashCode * 397) ^ DepartureDateUtcWithTicks.GetHashCode();
42+
hashCode = (hashCode * 397) ^ DepartureDateOffset.GetHashCode();
43+
hashCode = (hashCode * 397) ^ DepartureDateOffsetZero.GetHashCode();
44+
hashCode = (hashCode * 397) ^ DepartureDateOffsetNonLocal.GetHashCode();
45+
return hashCode;
46+
}
47+
}
48+
}
49+
}

0 commit comments

Comments
 (0)