Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    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);
    }
Esempio n. 3
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}\"," +
                           "\"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);
        });
    }
Esempio n. 5
0
        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);
        }