public void Read_ExtensionDetails_Different_Types_Works() { // Arrange var stringExtension = "|37dd3dd5-4a9619f953c40a16."; var boolExtension = false; var numberExtension = 123.456; var problemDetailsToSerialize = new ProblemDetails { Type = "https://tools.ietf.org/html/rfc7231#section-6.5.4", Title = "Not found", Status = 404, Detail = "Product not found", Instance = "https://example.com/products/14", Extensions = new Dictionary <string, object> { ["stringExtension"] = stringExtension, ["boolExtension"] = boolExtension, ["numberExtension"] = numberExtension, }, }; var writtenJson = Write(problemDetailsToSerialize); var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(writtenJson)); reader.Read(); // Act var problemDetails = new ProblemDetailsJsonConverter().Read(ref reader, typeof(ProblemDetails), JsonSerializerOptions); problemDetails.Extensions["stringExtension"].Should().Be(stringExtension); problemDetails.Extensions["boolExtension"].Should().Be(boolExtension); problemDetails.Extensions["numberExtension"].Should().Be(numberExtension); }
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}\"}}"; var converter = new ProblemDetailsJsonConverter(); var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(json)); reader.Read(); // Act var problemDetails = converter.Read(ref reader, typeof(ProblemDetails), 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); }
public void Write_Works() { // Arrange var traceId = "|37dd3dd5-4a9619f953c40a16."; var value = new ProblemDetails { 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\"]}}"; var converter = new ProblemDetailsJsonConverter(); 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 static HttpValidationProblemDetails ReadProblemDetails(ref Utf8JsonReader reader, JsonSerializerOptions options, HttpValidationProblemDetails problemDetails) { if (reader.TokenType != JsonTokenType.StartObject) { throw new JsonException("Unexcepted end when reading JSON."); } while (reader.Read() && reader.TokenType != JsonTokenType.EndObject) { if (reader.ValueTextEquals(Errors.EncodedUtf8Bytes)) { var errors = DeserializeErrors(ref reader, options); if (errors is not null) { foreach (var item in errors) { problemDetails.Errors[item.Key] = item.Value; } } } else { ProblemDetailsJsonConverter.ReadValue(ref reader, problemDetails, options); } } if (reader.TokenType != JsonTokenType.EndObject) { throw new JsonException("Unexcepted end when reading JSON."); } return(problemDetails);
public void Read_WithSomeMissingValues_Works() { // Arrange var type = "https://tools.ietf.org/html/rfc7231#section-6.5.4"; var title = "Not found"; var status = 404; var traceId = "|37dd3dd5-4a9619f953c40a16."; var json = $"{{\"type\":\"{type}\",\"title\":\"{title}\",\"status\":{status},\"traceId\":\"{traceId}\"}}"; var converter = new ProblemDetailsJsonConverter(); var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(json)); reader.Read(); // Act var problemDetails = converter.Read(ref reader, typeof(ProblemDetails), JsonSerializerOptions); Assert.Equal(type, problemDetails.Type); Assert.Equal(title, problemDetails.Title); Assert.Equal(status, problemDetails.Status); Assert.Collection( problemDetails.Extensions, kvp => { Assert.Equal("traceId", kvp.Key); Assert.Equal(traceId, kvp.Value.ToString()); }); }
public void Write_WithNull_DictionaryKeyPolicy_Works() { // Arrange var options = BlueprintJsonOptions.CreateOptions(); options.DictionaryKeyPolicy = null; var value = new ProblemDetails { Title = "Not found", Type = "https://tools.ietf.org/html/rfc7231#section-6.5.4", Status = 404, Extensions = new Dictionary <string, object> { ["Key1"] = "Value1", } }; var expected = $"{{\"type\":\"{JsonEncodedText.Encode(value.Type)}\",\"title\":\"{value.Title}\",\"status\":{value.Status},\"Key1\":\"Value1\"}}"; var converter = new ProblemDetailsJsonConverter(); var stream = new MemoryStream(); // Act using (var writer = new Utf8JsonWriter(stream)) { converter.Write(writer, value, options); } // Assert var actual = Encoding.UTF8.GetString(stream.ToArray()); actual.Should().Be(expected); }
public static void WriteProblemDetails(Utf8JsonWriter writer, HttpValidationProblemDetails value, JsonSerializerOptions options) { writer.WriteStartObject(); ProblemDetailsJsonConverter.WriteProblemDetails(writer, value, options); writer.WritePropertyName(Errors); JsonSerializer.Serialize(writer, value.Errors, options); writer.WriteEndObject(); }
public void Read_ThrowsIfJsonIsIncomplete() { // Arrange var json = "{"; var converter = new ProblemDetailsJsonConverter(); // Act & Assert Action convert = () => { var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(json)); converter.Read(ref reader, typeof(ProblemDetails), JsonSerializerOptions); }; convert.Should().ThrowExactly <JsonException>(); }
public void Read_ThrowsIfJsonIsIncomplete() { // Arrange var json = "{"; var converter = new ProblemDetailsJsonConverter(); // Act & Assert var ex = Record.Exception(() => { var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(json)); converter.Read(ref reader, typeof(ProblemDetails), JsonSerializerOptions); }); Assert.IsAssignableFrom <JsonException>(ex); }
public static void WriteProblemDetails(Utf8JsonWriter writer, HttpValidationProblemDetails value, JsonSerializerOptions options) { writer.WriteStartObject(); ProblemDetailsJsonConverter.WriteProblemDetails(writer, value, options); writer.WriteStartObject(Errors); foreach (var kvp in value.Errors) { writer.WritePropertyName(kvp.Key); JsonSerializer.Serialize(writer, kvp.Value, kvp.Value?.GetType() ?? typeof(object), options); } writer.WriteEndObject(); writer.WriteEndObject(); }
public void Write_WithSomeMissingContent_Works() { // Arrange var value = new ProblemDetails { 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}}}"; var converter = new ProblemDetailsJsonConverter(); var stream = new MemoryStream(); // Act using (var writer = new Utf8JsonWriter(stream)) { converter.Write(writer, value, JsonSerializerOptions); } // Assert var actual = Encoding.UTF8.GetString(stream.ToArray()); Assert.Equal(expected, actual); }