Skip to content

Commit

Permalink
Serialize GeoLocation with internal serializer (#3997)
Browse files Browse the repository at this point in the history
This commit adds GeoLocation to types handled by the internal serializer so that
a property on a document POCO of type GeoLocation is serialized by the internal serializer.

It's not possible with the current test configuration to test this scenario, because
IL rewriting happens after unit tests are run, so the Json.NET constructs used on Nest types
are recognised by the JsonNetSerializer. Have added test that _would_ test behaviour, should
tests be run after IL-merging in the future.

Fixes #3981

(cherry picked from commit 623c724)
  • Loading branch information
russcam authored and Mpdreamz committed Aug 9, 2019
1 parent 3dd9a32 commit 44e532a
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ public class HandleNestTypesOnSourceJsonConverter : JsonConverter
typeof(Attachment),
typeof(ILazyDocument),
typeof(LazyDocument),
typeof(GeoCoordinate)
typeof(GeoCoordinate),
typeof(GeoLocation)
};

private readonly IElasticsearchSerializer _builtInSerializer;
Expand Down
31 changes: 31 additions & 0 deletions src/Tests/Tests.Reproduce/GitHubIssue3981.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System.Text;
using Elastic.Xunit.XunitPlumbing;
using FluentAssertions;
using Nest;
using Tests.Core.Client;

namespace Tests.Reproduce
{
public class GitHubIssue3981
{
// This test always passes because the JsonPropertyAttribute on
// the GeoLocation type are recognized by the JsonNetSerializer when used in tests, because the
// IL rewriting to internalize Json.NET in the client happens *after* tests are run.
[U]
public void JsonNetSerializerSerializesGeoLocation()
{
var document = new Document
{
Location = new GeoLocation(45, 45)
};

var indexResponse = TestClient.InMemoryWithJsonNetSerializer.IndexDocument(document);
Encoding.UTF8.GetString(indexResponse.ApiCall.RequestBodyInBytes).Should().Contain("\"lat\"").And.Contain("\"lon\"");
}

private class Document
{
public GeoLocation Location { get; set; }
}
}
}

0 comments on commit 44e532a

Please sign in to comment.