예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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();
    }
예제 #8
0
        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);
        }