public async Task Constructor_BuffersRequestBody_ByDefault()
    {
        // Arrange
        var formatter = new NewtonsoftJsonPatchInputFormatter(
            GetLogger(),
            _serializerSettings,
            ArrayPool <char> .Shared,
            _objectPoolProvider,
            new MvcOptions(),
            new MvcNewtonsoftJsonOptions());

        var content      = "[{\"op\":\"add\",\"path\":\"Customer/Name\",\"value\":\"John\"}]";
        var contentBytes = Encoding.UTF8.GetBytes(content);

        var httpContext = new DefaultHttpContext();

        httpContext.Features.Set <IHttpResponseFeature>(new TestResponseFeature());
        httpContext.Request.Body        = new NonSeekableReadStream(contentBytes, allowSyncReads: false);
        httpContext.Request.ContentType = "application/json";

        var formatterContext = CreateInputFormatterContext(typeof(JsonPatchDocument <Customer>), httpContext);

        // Act
        var result = await formatter.ReadAsync(formatterContext);

        // Assert
        Assert.False(result.HasError);
        var patchDocument = Assert.IsType <JsonPatchDocument <Customer> >(result.Model);

        Assert.Equal("add", patchDocument.Operations[0].op);
        Assert.Equal("Customer/Name", patchDocument.Operations[0].path);
        Assert.Equal("John", patchDocument.Operations[0].value);
    }
    public async Task Constructor_SuppressInputFormatterBuffering_DoesNotBufferRequestBody()
    {
        // Arrange
        var mvcOptions = new MvcOptions()
        {
            SuppressInputFormatterBuffering = false,
        };
        var formatter = new NewtonsoftJsonPatchInputFormatter(
            GetLogger(),
            _serializerSettings,
            ArrayPool <char> .Shared,
            _objectPoolProvider,
            mvcOptions,
            new MvcNewtonsoftJsonOptions());

        var content      = "[{\"op\":\"add\",\"path\":\"Customer/Name\",\"value\":\"John\"}]";
        var contentBytes = Encoding.UTF8.GetBytes(content);

        var httpContext = new DefaultHttpContext();

        httpContext.Features.Set <IHttpResponseFeature>(new TestResponseFeature());
        httpContext.Request.Body        = new NonSeekableReadStream(contentBytes);
        httpContext.Request.ContentType = "application/json";

        var formatterContext = CreateInputFormatterContext(typeof(JsonPatchDocument <Customer>), httpContext);

        // Act
        // Mutate options after passing into the constructor to make sure that the value type is not store in the constructor
        mvcOptions.SuppressInputFormatterBuffering = true;
        var result = await formatter.ReadAsync(formatterContext);

        // Assert
        Assert.False(result.HasError);

        var patchDocument = Assert.IsType <JsonPatchDocument <Customer> >(result.Model);

        Assert.Equal("add", patchDocument.Operations[0].op);
        Assert.Equal("Customer/Name", patchDocument.Operations[0].path);
        Assert.Equal("John", patchDocument.Operations[0].value);

        Assert.False(httpContext.Request.Body.CanSeek);
        result = await formatter.ReadAsync(formatterContext);

        // Assert
        Assert.False(result.HasError);
        Assert.Null(result.Model);
    }