public void WriteUsingJsonSerializerOptionsWorks() { var errors = new Dictionary <string, string[]>() { { "Property", new string[] { "error0" } }, { "TwoWords", new string[] { "error1" } }, { "TopLevelProperty.PropertyName", new string[] { "error2" } }, }; var problemDetails = new ValidationProblemDetails(errors) { Title = "One or more validation errors occurred.", Status = 400 }; // Act var converter = new ValidationProblemDetailsJsonConverter(); using MemoryStream stream = new(); using Utf8JsonWriter writer = new(stream); var options = new JsonOptions().JsonSerializerOptions; options.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase; converter.Write(writer, problemDetails, options); writer.Flush(); var json = Encoding.UTF8.GetString(stream.ToArray()); var expectedJSON = $"{{\"title\":\"{problemDetails.Title}\",\"status\":{problemDetails.Status}," + "\"errors\":{\"property\":[\"error0\"],\"twoWords\":[\"error1\"],\"topLevelProperty.PropertyName\":[\"error2\"]}}"; Assert.NotNull(json); Assert.Equal(expectedJSON, json); }
public void WriteWorks() { var problemDetails = new ValidationProblemDetails(new Dictionary <string, string[]>() { { "Property", new string[] { "error0" } } }) { Title = "One or more validation errors occurred.", Status = 400 }; var converter = new ValidationProblemDetailsJsonConverter(); using MemoryStream stream = new(); using Utf8JsonWriter writer = new(stream); // Act converter.Write(writer, problemDetails, null); writer.Flush(); var json = Encoding.UTF8.GetString(stream.ToArray()); var expectedJSON = $"{{\"title\":\"{problemDetails.Title}\",\"status\":{problemDetails.Status}," + "\"errors\":{\"Property\":[\"error0\"]}}"; Assert.NotNull(json); Assert.Equal(expectedJSON, json); }
public void Read_Works() { // Arrange var type = "https://tools.ietf.org/html/rfc7231#section-6.5.4"; var title = "Not found"; var status = 404; var detail = "Product not found"; var instance = "http://example.com/products/14"; var traceId = "|37dd3dd5-4a9619f953c40a16."; var json = $"{{\"type\":\"{type}\",\"title\":\"{title}\",\"status\":{status},\"detail\":\"{detail}\", \"instance\":\"{instance}\",\"traceId\":\"{traceId}\"," + "\"errors\":{\"key0\":[\"error0\"],\"key1\":[\"error1\",\"error2\"]}}"; var converter = new ValidationProblemDetailsJsonConverter(); var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(json)); reader.Read(); // Act var problemDetails = converter.Read(ref reader, typeof(ValidationProblemDetails), JsonSerializerOptions); problemDetails.Type.Should().Be(type); problemDetails.Title.Should().Be(title); problemDetails.Status.Should().Be(status); problemDetails.Instance.Should().Be(instance); problemDetails.Detail.Should().Be(detail); problemDetails.Extensions["traceId"].ToString().Should().Be(traceId); problemDetails.Errors["key0"].Should().BeEquivalentTo("error0"); problemDetails.Errors["key1"].Should().BeEquivalentTo("error1", "error2"); }
public void Read_Works() { // Arrange var type = "https://tools.ietf.org/html/rfc7231#section-6.5.4"; var title = "Not found"; var status = 404; var detail = "Product not found"; var instance = "http://example.com/products/14"; var traceId = "|37dd3dd5-4a9619f953c40a16."; var json = $"{{\"type\":\"{type}\",\"title\":\"{title}\",\"status\":{status},\"detail\":\"{detail}\", \"instance\":\"{instance}\",\"traceId\":\"{traceId}\"," + "\"errors\":{\"key0\":[\"error0\"],\"key1\":[\"error1\",\"error2\"]}}"; var converter = new ValidationProblemDetailsJsonConverter(); var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(json)); reader.Read(); // Act var problemDetails = converter.Read(ref reader, typeof(ValidationProblemDetails), JsonSerializerOptions); Assert.Equal(type, problemDetails.Type); Assert.Equal(title, problemDetails.Title); Assert.Equal(status, problemDetails.Status); Assert.Equal(instance, problemDetails.Instance); Assert.Equal(detail, problemDetails.Detail); Assert.Collection( problemDetails.Extensions, kvp => { Assert.Equal("traceId", kvp.Key); Assert.Equal(traceId, kvp.Value.ToString()); }); Assert.Collection( problemDetails.Errors.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal("key0", kvp.Key); Assert.Equal(new[] { "error0" }, kvp.Value); }, kvp => { Assert.Equal("key1", kvp.Key); Assert.Equal(new[] { "error1", "error2" }, kvp.Value); }); }
public void Write_Works() { // Arrange var traceId = "|37dd3dd5-4a9619f953c40a16."; var value = new ValidationProblemDetails(new Dictionary <string, IEnumerable <string> > { { "Property0", new [] { "error0" } }, { "Property1", new [] { "error1", "error2" } } }) { Title = "Not found", Type = "https://tools.ietf.org/html/rfc7231#section-6.5.4", Status = 404, Detail = "Product not found", Instance = "http://example.com/products/14", Extensions = new Dictionary <string, object> { { "traceId", traceId }, { "some-data", new[] { "value1", "value2" } } }, }; var expected = $"{{\"type\":\"{JsonEncodedText.Encode(value.Type)}\",\"title\":\"{value.Title}\",\"status\":{value.Status},\"detail\":\"{value.Detail}\",\"instance\":\"{JsonEncodedText.Encode(value.Instance)}\",\"traceId\":\"{traceId}\",\"some-data\":[\"value1\",\"value2\"],\"errors\":{{\"property0\":[\"error0\"],\"property1\":[\"error1\",\"error2\"]}}}}"; var converter = new ValidationProblemDetailsJsonConverter(); var stream = new MemoryStream(); // Act using (var writer = new Utf8JsonWriter(stream)) { converter.Write(writer, value, JsonSerializerOptions); } // Assert var actual = Encoding.UTF8.GetString(stream.ToArray()); actual.Should().Be(expected); }
public void Write_WithSomeMissingContent_Works() { // Arrange var value = new ValidationProblemDetails { Title = "Not found", Type = "https://tools.ietf.org/html/rfc7231#section-6.5.4", Status = 404, }; var expected = $"{{\"type\":\"{JsonEncodedText.Encode(value.Type)}\",\"title\":\"{value.Title}\",\"status\":{value.Status},\"errors\":{{}}}}"; var converter = new ValidationProblemDetailsJsonConverter(); var stream = new MemoryStream(); // Act using (var writer = new Utf8JsonWriter(stream)) { converter.Write(writer, value, JsonSerializerOptions); } // Assert var actual = Encoding.UTF8.GetString(stream.ToArray()); actual.Should().Be(expected); }