/// <inheritdoc />
        public IAndHttpRequestBuilder WithBody <TBody>(TBody body, string contentType, Encoding encoding)
        {
            var stream = FormattersHelper.WriteAsStringToStream(body, contentType, encoding);

            return(this
                   .WithContentType(this.request.ContentType ?? contentType)
                   .WithContentLength(this.request.ContentLength ?? stream.Length)
                   .WithBody(stream));
        }
        public void WriteToStreamShouldWorkCorrectlyWithObject()
        {
            var result = FormattersHelper.WriteToStream(new { id = 1, text = "test" }, ContentType.ApplicationJson, Encoding.UTF8);

            using (var reader = new StreamReader(result))
            {
                var text = reader.ReadToEnd();

                Assert.Equal(@"{""id"":1,""text"":""test""}", text);
            }
        }
        public void WriteToStreamShouldWorkCorrectlyWithString()
        {
            var result = FormattersHelper.WriteToStream("test", ContentType.TextPlain, Encoding.UTF8);

            using (var reader = new StreamReader(result))
            {
                var text = reader.ReadToEnd();

                Assert.Equal("test", text);
            }
        }
        public void ReadFromStreamShouldReturnNullIfContentCannotBeParsed()
        {
            var stream       = new MemoryStream();
            var streamWriter = new StreamWriter(stream);

            streamWriter.WriteLine(@"{""Integer"":1,""RequiredString"":""Test""");
            streamWriter.Flush();

            var result = FormattersHelper.ReadFromStream <RequestModel>(stream, ContentType.ApplicationJson, Encoding.UTF8);

            Assert.Null(result);
        }
        public void ReadFromStreamShouldThrowExceptionIfNoModelIsDifferentType()
        {
            Test.AssertException <InvalidDataException>(
                () =>
            {
                var stream       = new MemoryStream();
                var streamWriter = new StreamWriter(stream);
                streamWriter.WriteLine(@"test");
                streamWriter.Flush();

                FormattersHelper.ReadFromStream <RequestModel>(stream, ContentType.TextPlain, Encoding.UTF8);
            },
                "Expected stream content to be formatted to RequestModel when using 'text/plain', but instead received String.");
        }
        public void ReadFromStreamShouldThrowExceptionIfNoFormatterIsFound()
        {
            Test.AssertException <NullReferenceException>(
                () =>
            {
                var stream       = new MemoryStream();
                var streamWriter = new StreamWriter(stream);
                streamWriter.WriteLine(@"test");
                streamWriter.Flush();

                FormattersHelper.ReadFromStream <RequestModel>(stream, ContentType.TextHtml, Encoding.UTF8);
            },
                "Formatter able to process 'text/html' could not be resolved from the services provider. Before running this test case, the formatter should be registered in the 'StartsFrom' method and cannot be null.");
        }
        /// <inheritdoc />
        public IAndHttpResponseTestBuilder WithBody <TBody>(TBody body, string contentType, Encoding encoding)
        {
            var parsedBody = FormattersHelper.ReadFromStream <TBody>(this.httpResponse.Body, contentType, encoding);

            if (Reflection.AreNotDeeplyEqual(body, parsedBody))
            {
                this.ThrowNewHttpResponseAssertionException(
                    "body",
                    "to be the given object",
                    "in fact it was different");
            }

            return(this.WithContentType(contentType));
        }
        public void ReadFromStreamShouldWorkCorrectly()
        {
            var stream       = new MemoryStream();
            var streamWriter = new StreamWriter(stream);

            streamWriter.WriteLine(@"{""Integer"":1,""RequiredString"":""Test""}");
            streamWriter.Flush();

            var result = FormattersHelper.ReadFromStream <RequestModel>(stream, ContentType.ApplicationJson, Encoding.UTF8);

            Assert.NotNull(result);
            Assert.Equal(1, result.Integer);
            Assert.Equal("Test", result.RequiredString);
            Assert.Null(result.NonRequiredString);
            Assert.Equal(0, result.NotValidateInteger);
        }
        /// <inheritdoc />
        public IAndHttpResponseTestBuilder WithBodyOfType <TBody>(string contentType, Encoding encoding)
        {
            try
            {
                FormattersHelper.ReadFromStream <TBody>(this.httpResponse.Body, contentType, encoding);
            }
            catch (InvalidDataException)
            {
                this.ThrowNewHttpResponseAssertionException(
                    "body",
                    $"to be of {typeof(TBody).ToFriendlyTypeName()} type when using '{contentType}'",
                    $"in fact it was not");
            }

            return(this.WithContentType(contentType));
        }