public void CanPlaybackRecordingSessionFromRecorder()
        {
            // ARRANGE
            var requestUrl = new Uri("http://www.github.com");

            var recordingSession = new RecordingSession();

            var liveRequest  = new HttpWebRequestWrapperRecorder(recordingSession, requestUrl);
            var liveResponse = (HttpWebResponse)liveRequest.GetResponse();

            var playbackRequestCreator =
                new HttpWebRequestWrapperInterceptorCreator(
                    new RecordingSessionInterceptorRequestBuilder(recordingSession));

            var playbackRequest = playbackRequestCreator.Create(requestUrl);

            // ACT
            var playbackResponse = (HttpWebResponse)playbackRequest.GetResponse();

            string liveResponseBody;

            using (var sr = new StreamReader(liveResponse.GetResponseStream()))
                liveResponseBody = sr.ReadToEnd();

            string playbackResponseBody;

            using (var sr = new StreamReader(playbackResponse.GetResponseStream()))
                playbackResponseBody = sr.ReadToEnd();

            // ASSERT
            playbackResponse.StatusCode.ShouldEqual(liveResponse.StatusCode);
            playbackResponseBody.ShouldEqual(liveResponseBody);

            playbackResponse.Headers.ShouldEqual(liveResponse.Headers);
        }
        public void CanCustomizeResponseBuilder()
        {
            // ARRANGE
            var customResponseBody = "Custom Response";
            var recordedRequest    = new RecordedRequest
            {
                Url    = "http://fakeSite.fake",
                Method = "GET"
            };

            var recordingSession = new RecordingSession {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest
                }
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession)
            {
                RecordedResultResponseBuilder =
                    (recordedReq, interceptedReq) => interceptedReq.HttpWebResponseCreator.Create(customResponseBody)
            };

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = creator.Create(new Uri(recordedRequest.Url));

            // ACT
            var response = request.GetResponse();

            // ASSERT
            response.ShouldNotBeNull();

            using (var sr = new StreamReader(response.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(customResponseBody);
        }
        public void CanCustomizeNotFoundBehavior()
        {
            // ARRANGE
            var customNotFoundResponseBody = "Not Found";

            var recordingSession = new RecordingSession[0];

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession)
            {
                RequestNotFoundResponseBuilder = req =>
                                                 req.HttpWebResponseCreator.Create(customNotFoundResponseBody)
            };

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = creator.Create(new Uri("http://fakeSite.fake"));

            // ACT
            var response = request.GetResponse();

            // ASSERT
            response.ShouldNotBeNull();

            using (var sr = new StreamReader(response.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(customNotFoundResponseBody);
        }
        public void CanGetFunky()
        {
            // ARRANGE
            var responseCreator = new Func <InterceptedRequest, HttpWebResponse>(req =>
                                                                                 HttpWebResponseCreator.Create(
                                                                                     new Uri("https://unreleatedFake.site"),
                                                                                     "HEAD",
                                                                                     HttpStatusCode.Ambiguous,
                                                                                     new MemoryStream(Encoding.UTF8.GetBytes("Funky Response")),
                                                                                     new WebHeaderCollection
            {
                { HttpResponseHeader.Date, DateTime.Now.ToShortDateString() }
            },
                                                                                     DecompressionMethods.None,
                                                                                     mediaType: "application/sql",
                                                                                     contentLength: 128,
                                                                                     statusDescription: "status",
                                                                                     isVersionHttp11: false,
                                                                                     usesProxySemantics: true,
                                                                                     isWebSocket: true,
                                                                                     connectionGroupName: "Testing Group"));

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(responseCreator);
            var request = creator.Create(new Uri("http://fakeSite.fake"));

            // ACT
            var response = (HttpWebResponse)request.GetResponse();

            // ASSERT
            response.ShouldNotBeNull();
            response.Method.ToUpper().ShouldNotEqual("GET");
            response.StatusCode.ShouldNotEqual(HttpStatusCode.Accepted);
            response.Headers.AllKeys.ShouldNotBeEmpty();
            response.ProtocolVersion.Minor.ShouldEqual(0);
        }
        public void CanPlaybackFromSerializedRecordingSession()
        {
            // ARRANGE

            // recording session is for github.com
            var requestUrl = new Uri("http://www.github.com");

            string json;

            using (var resource = GetType().Assembly.GetManifestResourceStream("HttpWebRequestWrapper.Tests.RecordingSession.json"))
                using (var sr = new StreamReader(resource))
                    json = sr.ReadToEnd();

            var recordingSession = JsonConvert.DeserializeObject <RecordingSession>(json);

            var creator = new HttpWebRequestWrapperInterceptorCreator(
                new RecordingSessionInterceptorRequestBuilder(recordingSession));

            var playbackRequest = (HttpWebRequest)creator.Create(requestUrl);

            playbackRequest.CookieContainer = new CookieContainer();

            // ACT
            var playbackResponse = (HttpWebResponse)playbackRequest.GetResponse();

            // ASSERT
            playbackResponse.StatusCode.ShouldEqual(HttpStatusCode.OK);
            playbackResponse.Headers.Count.ShouldEqual(19);
            playbackResponse.Cookies.Count.ShouldEqual(2);
            playbackResponse.Cookies.ToList().First().Name.ShouldEqual("logged_in");

            using (var sr = new StreamReader(playbackResponse.GetResponseStream()))
                sr.ReadToEnd().ShouldContain("<html");
        }
        public void CanSpoofAsyncResponse()
        {
            var responseBody = "Test Payload";

            var responseCreator = new Func <InterceptedRequest, HttpWebResponse>(req =>
                                                                                 req.HttpWebResponseCreator.Create(responseBody));

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(responseCreator);

            var request = creator.Create(new Uri("http://fakeSite.fake"));

            // ACT
            HttpWebResponse response    = null;
            var             asyncResult = request.BeginGetResponse(result =>
            {
                response = (HttpWebResponse)(result.AsyncState as HttpWebRequest).EndGetResponse(result);
            },
                                                                   request);

            if (!asyncResult.IsCompleted)
            {
                Thread.Sleep(TimeSpan.FromMilliseconds(250));
            }

            if (!asyncResult.IsCompleted)
            {
                throw new Exception("Web Response didn't come back in reasonable time frame");
            }

            // ASSERT
            response.ShouldNotBeNull();

            using (var sr = new StreamReader(response.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(responseBody);
        }
        public void CanSpoofWebRequestException()
        {
            // ARRANGE
            var fakeUrl = new Uri("http://fakeSite.fake");

            var fakeResponse =
                HttpWebResponseCreator.Create(
                    fakeUrl,
                    "GET",
                    HttpStatusCode.BadRequest,
                    "Test Response Body",
                    new WebHeaderCollection
            {
                { HttpResponseHeader.ETag, "testHeaders" }
            });

            var fakeException = new WebException(
                "Bad Request",
                innerException: null,
                status: WebExceptionStatus.SendFailure,
                response: fakeResponse);

            var responseCreator = new Func <InterceptedRequest, HttpWebResponse>(req => throw fakeException);

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(responseCreator);
            var request = creator.Create(fakeUrl);

            // ACT
            var exception    = Record.Exception(() => request.GetResponse());
            var webException = exception as WebException;

            // ASSERT
            webException.ShouldNotBeNull();
            webException.ShouldEqual(fakeException);
        }
        public void CanSetRequestPayloadAndReceiveItBackInInterceptedRequest()
        {
            // ARRANGE
            var requestPayload = "Test Payload";

            InterceptedRequest interceptedRequest = null;
            var responseCreator = new Func <InterceptedRequest, HttpWebResponse>(req =>
            {
                interceptedRequest = req;
                return(null);
            });

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(responseCreator);
            var request = creator.Create(new Uri("http://fakeSite.fake"));

            request.Method = "POST";

            using (var sw = new StreamWriter(request.GetRequestStream()))
                sw.Write(requestPayload);

            // ACT
            request.GetResponse();

            // ASSERT
            interceptedRequest.ShouldNotBeNull();
            interceptedRequest.RequestPayload.ShouldEqual(requestPayload);
        }
        public void BuilderSetsInvalidOperationException()
        {
            // ARRANGE
            var recordedRequest = new RecordedRequest
            {
                Url               = "http://fakeSite.fake",
                Method            = "GET",
                ResponseException = new RecordedResponseException
                {
                    Message = "Test Exception Message",
                    Type    = typeof(InvalidOperationException)
                }
            };

            var recordingSession = new RecordingSession {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest
                }
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession);

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = creator.Create(new Uri(recordedRequest.Url));

            // ACT
            var exception = Record.Exception(() => request.GetResponse());

            // ASSERT
            exception.ShouldNotBeNull();
            exception.ShouldBeType <InvalidOperationException>();
            exception.Message.ShouldEqual(recordedRequest.ResponseException.Message);
        }
        public void CanSpoofGetRequest()
        {
            // ARRANGE
            var responseBody = "Test Response";
            var method       = "GET";

            var responseCreator = new Func <InterceptedRequest, HttpWebResponse>(req =>
                                                                                 req.HttpWebResponseCreator.Create(responseBody));

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(responseCreator);

            var request = creator.Create(new Uri("http://fakeSite.fake"));

            request.Method = method;

            // ACT
            var response = (HttpWebResponse)request.GetResponse();

            // ASSERT
            response.Method.ShouldEqual(method);
            response.StatusCode.ShouldEqual(HttpStatusCode.OK);

            using (var sr = new StreamReader(response.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(responseBody);
        }
        public void BuilderSetsResponseStatusCode()
        {
            // ARRANGE
            var recordedRequest = new RecordedRequest
            {
                Url                = "http://fakeSite.fake",
                Method             = "GET",
                ResponseStatusCode = HttpStatusCode.Forbidden
            };

            var recordingSession = new RecordingSession {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest
                }
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession);

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = creator.Create(new Uri(recordedRequest.Url));

            // ACT
            var response = (HttpWebResponse)request.GetResponse();

            // ASSERT
            response.ShouldNotBeNull();
            response.StatusCode.ShouldEqual(recordedRequest.ResponseStatusCode);
        }
        public void BuilderSetsResponseHeaders()
        {
            // ARRANGE
            var recordedRequest = new RecordedRequest
            {
                Url             = "http://fakeSite.fake",
                Method          = "GET",
                ResponseHeaders = new RecordedHeaders {
                    { "Header1", new [] { "Header1Value" } }
                }
            };

            var recordingSession = new RecordingSession {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest
                }
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession);

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = creator.Create(new Uri(recordedRequest.Url));

            // ACT
            var response = (HttpWebResponse)request.GetResponse();

            // ASSERT
            response.ShouldNotBeNull();

            recordedRequest.ResponseHeaders.ShouldEqual((RecordedHeaders)response.Headers);
        }
        public void BuilderSetsResponseBody()
        {
            // ARRANGE
            var recordedRequest = new RecordedRequest
            {
                Url          = "http://fakeSite.fake",
                Method       = "GET",
                ResponseBody = "Response Body"
            };

            var recordingSession = new RecordingSession {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest
                }
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession);

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = creator.Create(new Uri(recordedRequest.Url));

            // ACT
            var response = request.GetResponse();

            // ASSERT
            response.ShouldNotBeNull();

            using (var sr = new StreamReader(response.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(recordedRequest.ResponseBody.SerializedStream);
        }
        public async Task CanSpoofAsyncRequest()
        {
            var requestPayload = "Test Request";
            var responseBody   = "Test Response";

            var responseCreator = new Func <InterceptedRequest, HttpWebResponse>(req =>
            {
                if (req.RequestPayload.SerializedStream != requestPayload)
                {
                    throw new Exception($"{nameof(requestPayload)} was not parsed correctly.");
                }

                return(req.HttpWebResponseCreator.Create(responseBody));
            });

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(responseCreator);

            var request = (HttpWebRequest)creator.Create(new Uri("http://fakeSite.fake"));

            request.Method = "POST";

            // ACT

            using (var sw = new StreamWriter(await request.GetRequestStreamAsync()))
                await sw.WriteAsync(requestPayload);

            var response = await request.GetResponseAsync();

            // ASSERT
            response.ShouldNotBeNull();

            using (var sr = new StreamReader(response.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(responseBody);
        }
        public void CanSpoofResponseWithCookies()
        {
            // ARRANGE
            var cookieContainer = new CookieContainer();

            var responseCreator = new Func <InterceptedRequest, HttpWebResponse>(req =>
                                                                                 req.HttpWebResponseCreator.Create(
                                                                                     "Test Response Body",
                                                                                     responseHeaders: new WebHeaderCollection
            {
                { HttpResponseHeader.SetCookie, "cookie=true" }
            }));

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(responseCreator);
            var request = (HttpWebRequest)creator.Create(new Uri("http://fakeSite.fake"));

            request.CookieContainer = cookieContainer;

            // ACT
            var response = (HttpWebResponse)request.GetResponse();

            // ASSERT
            response.Cookies.Count.ShouldEqual(1);
            response.Cookies.ToList().First().Name.ShouldEqual("cookie");
            response.Cookies.ToList().First().Value.ShouldEqual("true");
        }
        public void MatchesOnZippedPayload()
        {
            // ARRANGE
            var recordedRequest = new RecordedRequest
            {
                Url            = "http://fakeSite.fake",
                Method         = "POST",
                RequestPayload = new RecordedStream
                {
                    SerializedStream    = "Request 1",
                    IsGzippedCompressed = true
                },
                RequestHeaders = new RecordedHeaders
                {
                    { "Content-Type", new [] { "text/plain" } }
                },
                ResponseBody = "Response 1"
            };

            var recordingSession = new RecordingSession
            {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest
                }
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession);

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = creator.Create(new Uri(recordedRequest.Url));

            request.Method      = "POST";
            request.ContentType = "text/plain";

            using (var input = new MemoryStream(Encoding.UTF8.GetBytes(recordedRequest.RequestPayload.SerializedStream)))
                using (var compressed = new MemoryStream())
                    using (var zip = new GZipStream(compressed, CompressionMode.Compress, leaveOpen: true))
                    {
                        input.CopyTo(zip);
                        zip.Close();
                        compressed.Seek(0, SeekOrigin.Begin);
                        compressed.CopyTo(request.GetRequestStream());
                    }

            // ACT
            var response = request.GetResponse();

            // ASSERT
            response.ShouldNotBeNull();

            using (var sr = new StreamReader(response.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(recordedRequest.ResponseBody.SerializedStream);
        }
        public void GetResponseReturnsARealHttpWebResponse()
        {
            // ARRANGE
            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(req => req.HttpWebResponseCreator.Create("Test"));
            var request = creator.Create(new Uri("http://fakeSite.fake"));

            // ACT
            var response = request.GetResponse();

            // ASSERT
            response.ShouldBeType <HttpWebResponse>();
        }
        public void CanSetRecordedRequestsToOnlyMatchOnce()
        {
            // ARRANGE
            var recordedRequest1 = new RecordedRequest
            {
                Url          = "http://fakeSite.fake/1",
                Method       = "GET",
                ResponseBody = "Response 1"
            };

            var recordedRequest2 = new RecordedRequest
            {
                Url          = "http://fakeSite.fake/2",
                Method       = recordedRequest1.Method,
                ResponseBody = "Response 2"
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(
                new RecordingSession {
                RecordedRequests = { recordedRequest1, recordedRequest1, recordedRequest2 }
            })
            {
                AllowReplayingRecordedRequestsMultipleTimes = false
            };

            var creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            // ACT
            var response1a = (HttpWebResponse)creator.Create(new Uri(recordedRequest1.Url)).GetResponse();
            var response1b = (HttpWebResponse)creator.Create(new Uri(recordedRequest1.Url)).GetResponse();
            var response1c = (HttpWebResponse)creator.Create(new Uri(recordedRequest1.Url)).GetResponse();
            var response2a = (HttpWebResponse)creator.Create(new Uri(recordedRequest2.Url)).GetResponse();
            var response2b = (HttpWebResponse)creator.Create(new Uri(recordedRequest2.Url)).GetResponse();

            // ASSERT
            response1a.ShouldNotBeNull();
            response1b.ShouldNotBeNull();
            response1c.ShouldNotBeNull();
            response2a.ShouldNotBeNull();
            response2b.ShouldNotBeNull();

            using (var sr = new StreamReader(response1a.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(recordedRequest1.ResponseBody.SerializedStream);

            using (var sr = new StreamReader(response1b.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(recordedRequest1.ResponseBody.SerializedStream);

            using (var sr = new StreamReader(response2a.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(recordedRequest2.ResponseBody.SerializedStream);

            response1c.StatusCode.ShouldEqual(HttpStatusCode.NotFound);
            response2b.StatusCode.ShouldEqual(HttpStatusCode.NotFound);
        }
        public void CanPlaybackFromMultipleRecordingSessions()
        {
            // ARRANGE
            var recordedRequest1 = new RecordedRequest
            {
                Url          = "http://fakeSite.fake/1",
                Method       = "GET",
                ResponseBody = "Response 1"
            };

            var recordedRequest2 = new RecordedRequest
            {
                Url          = "http://fakeSite.fake/2",
                Method       = recordedRequest1.Method,
                ResponseBody = "Response 2"
            };

            var recordingSession1 = new RecordingSession
            {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest1
                }
            };

            var recordingSession2 = new RecordingSession
            {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest2
                }
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession1, recordingSession2);

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request1 = creator.Create(new Uri(recordedRequest1.Url));
            var request2 = creator.Create(new Uri(recordedRequest2.Url));

            // ACT
            var response1 = request1.GetResponse();
            var response2 = request2.GetResponse();

            // ASSERT
            response1.ShouldNotBeNull();
            response2.ShouldNotBeNull();

            using (var sr = new StreamReader(response1.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(recordedRequest1.ResponseBody.SerializedStream);

            using (var sr = new StreamReader(response2.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(recordedRequest2.ResponseBody.SerializedStream);
        }
        public void BuilderSetsWebExceptionWithResponse()
        {
            // ARRANGE
            var recordedRequest = new RecordedRequest
            {
                Url               = "http://fakeSite.fake",
                Method            = "GET",
                ResponseException = new RecordedResponseException
                {
                    Message            = "Test Exception Message",
                    Type               = typeof(WebException),
                    WebExceptionStatus = WebExceptionStatus.ConnectionClosed
                },
                ResponseBody    = "Fake Error Response",
                ResponseHeaders = new RecordedHeaders {
                    { "header1", new [] { "value1" } }
                },
                ResponseStatusCode = HttpStatusCode.InternalServerError
            };

            var recordingSession = new RecordingSession {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest
                }
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession);

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = creator.Create(new Uri(recordedRequest.Url));

            // ACT
            var exception            = Record.Exception(() => request.GetResponse());
            var webException         = exception as WebException;
            var webExceptionResponse = webException.Response as HttpWebResponse;

            // ASSERT
            webException.ShouldNotBeNull();
            webException.Message.ShouldEqual(recordedRequest.ResponseException.Message);
            webException.Status.ShouldEqual(recordedRequest.ResponseException.WebExceptionStatus.Value);

            webExceptionResponse.ShouldNotBeNull();
            Assert.Equal(recordedRequest.ResponseHeaders, (RecordedHeaders)webExceptionResponse.Headers);
            webExceptionResponse.StatusCode.ShouldEqual(recordedRequest.ResponseStatusCode);
            webExceptionResponse.ContentLength.ShouldBeGreaterThan(0);

            using (var sr = new StreamReader(webExceptionResponse.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(recordedRequest.ResponseBody.SerializedStream);
        }
        public void CanCreateResponseSpecificToRequestPayload()
        {
            // ARRANGE
            var fakeUrl = new Uri("http://fakeSite.fake");

            var fakePayload1         = "payload1";
            var fakePayload1Response = "fakeResponse1";
            var fakePayload2         = "payload2";
            var fakePayload2Response = "fakeResponse2";

            var responseCreator = new Func <InterceptedRequest, HttpWebResponse>(req =>
            {
                if (req.RequestPayload.SerializedStream == fakePayload1)
                {
                    return(req.HttpWebResponseCreator.Create(fakePayload1Response));
                }

                if (req.RequestPayload.SerializedStream == fakePayload2)
                {
                    return(req.HttpWebResponseCreator.Create(fakePayload2Response));
                }

                throw new Exception("Couldn't match request to response");
            });

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(responseCreator);

            var request1 = creator.Create(fakeUrl);

            request1.Method = "POST";
            using (var sw = new StreamWriter(request1.GetRequestStream()))
                sw.Write(fakePayload1);

            var request2 = creator.Create(fakeUrl);

            request2.Method = "POST";
            using (var sw = new StreamWriter(request2.GetRequestStream()))
                sw.Write(fakePayload2);

            // ACT
            var response1 = request1.GetResponse();
            var response2 = request2.GetResponse();

            // ASSERT
            using (var sr = new StreamReader(response1.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(fakePayload1Response);

            using (var sr = new StreamReader(response2.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(fakePayload2Response);
        }
        public void BuilderAlwaysSetsWebExceptionResponseWhenStatusIsProtocolError()
        {
            // ARRANGE
            var recordedRequest = new RecordedRequest
            {
                Url               = "http://fakeSite.fake",
                Method            = "GET",
                ResponseException = new RecordedResponseException
                {
                    Message            = "Test Exception Message",
                    Type               = typeof(WebException),
                    WebExceptionStatus = WebExceptionStatus.ProtocolError
                },
                ResponseHeaders = new RecordedHeaders
                {
                    { "header1", new[] { "value1" } }
                },
                ResponseStatusCode = HttpStatusCode.Unauthorized
                                     //intentionally leave ResponseBody null
            };

            var recordingSession = new RecordingSession {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest
                }
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession);

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = creator.Create(new Uri(recordedRequest.Url));

            // ACT
            var exception            = Record.Exception(() => request.GetResponse());
            var webException         = exception as WebException;
            var webExceptionResponse = webException.Response as HttpWebResponse;

            // ASSERT
            webException.ShouldNotBeNull();
            webException.Message.ShouldEqual(recordedRequest.ResponseException.Message);
            webException.Status.ShouldEqual(recordedRequest.ResponseException.WebExceptionStatus.Value);

            webExceptionResponse.ShouldNotBeNull();
            Assert.Equal(recordedRequest.ResponseHeaders, (RecordedHeaders)webExceptionResponse.Headers);
            webExceptionResponse.StatusCode.ShouldEqual(recordedRequest.ResponseStatusCode);
            // no response content in recordedResponse, so content length should be 0
            webExceptionResponse.ContentLength.ShouldEqual(0);
        }
        public void CanSpoofResponseWithText()
        {
            // ARRANGE
            var fakeResponseBody = "Test";

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(req => req.HttpWebResponseCreator.Create(fakeResponseBody));
            var request = creator.Create(new Uri("http://fakeSite.fake"));

            // ACT
            var response = request.GetResponse();

            // ASSERT
            using (var sr = new StreamReader(response.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(fakeResponseBody);
        }
        public void CanCreateResponseSpecificToRequestHeaders()
        {
            // ARRANGE
            var fakeUrl = new Uri("http://fakeSite.fake");

            var fakeJsonContentType = "application/json";
            var fakeJsonResponse    = "fakeJsonResponse";
            var fakeXmlContentType  = "application/xml";
            var fakeXmlResponse     = "fakeXmlResponse";

            var responseCreator = new Func <InterceptedRequest, HttpWebResponse>(req =>
            {
                if (req.HttpWebRequest.Headers[HttpRequestHeader.ContentType] == fakeJsonContentType)
                {
                    return(req.HttpWebResponseCreator.Create(fakeJsonResponse));
                }

                if (req.HttpWebRequest.Headers[HttpRequestHeader.ContentType] == fakeXmlContentType)
                {
                    return(req.HttpWebResponseCreator.Create(fakeXmlResponse));
                }

                throw new Exception("Couldn't match request to response");
            });

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(responseCreator);

            var jsonRequest = creator.Create(fakeUrl);

            jsonRequest.ContentType = fakeJsonContentType;

            var xmlRequest = creator.Create(fakeUrl);

            xmlRequest.ContentType = fakeXmlContentType;

            // ACT
            var jsonResponse = jsonRequest.GetResponse();
            var xmlResponse  = xmlRequest.GetResponse();

            // ASSERT
            using (var sr = new StreamReader(jsonResponse.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(fakeJsonResponse);

            using (var sr = new StreamReader(xmlResponse.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(fakeXmlResponse);
        }
        public void CanSpoofResponseWithNullText()
        {
            // ARRANGE

            // just make sure this doesn't throw an exception
            string fakeResponseBody = null;

            var creator = new HttpWebRequestWrapperInterceptorCreator(req => req.HttpWebResponseCreator.Create(fakeResponseBody));
            var request = creator.Create(new Uri("http://fakeSite.fake"));

            // ACT
            var response = request.GetResponse();

            // ASSERT
            using (var sr = new StreamReader(response.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(string.Empty);
        }
        public void DefaultNotFoundBehaviorReturns404()
        {
            // ARRANGE
            var recordingSession = new RecordingSession[0];

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession);

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = creator.Create(new Uri("http://fakeSite.fake"));

            // ACT
            var response = (HttpWebResponse)request.GetResponse();

            // ASSERT
            response.ShouldNotBeNull();
            response.StatusCode.ShouldEqual(HttpStatusCode.NotFound);
        }
        public void CanCreateResponseSpecificToRequestMethod()
        {
            // ARRANGE
            var fakeUrl = new Uri("http://fakeSite.fake");

            var fakeGetResponse  = "fakeResponse1";
            var fakePostResponse = "fakeResponse1";

            var responseCreator = new Func <InterceptedRequest, HttpWebResponse>(req =>
            {
                if (req.HttpWebRequest.Method.ToLower() == "get")
                {
                    return(req.HttpWebResponseCreator.Create(fakeGetResponse));
                }

                if (req.HttpWebRequest.Method.ToLower() == "post")
                {
                    return(req.HttpWebResponseCreator.Create(fakePostResponse));
                }

                throw new Exception("Couldn't match request to response");
            });

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(responseCreator);

            var getRequest = creator.Create(fakeUrl);

            getRequest.Method = "GET";
            var postRequest = creator.Create(fakeUrl);

            postRequest.Method = "POST";

            // ACT
            var getResponse  = getRequest.GetResponse();
            var postResponse = postRequest.GetResponse();

            // ASSERT
            using (var sr = new StreamReader(getResponse.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(fakeGetResponse);

            using (var sr = new StreamReader(postResponse.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(fakePostResponse);
        }
        public void CanSpoofResponseHttpStatusCode()
        {
            // ARRANGE
            var fakeStatusCode = HttpStatusCode.NotFound;

            var responseCreator = new Func <InterceptedRequest, HttpWebResponse>(req =>
                                                                                 req.HttpWebResponseCreator.Create(
                                                                                     "Test Response Body",
                                                                                     fakeStatusCode));

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(responseCreator);
            var request = creator.Create(new Uri("http://fakeSite.fake"));

            // ACT
            var response = (HttpWebResponse)request.GetResponse();

            // ASSERT
            response.StatusCode.ShouldEqual(fakeStatusCode);
        }
        public void CanSetOnMatchEventHandler()
        {
            var matchCallCount = 0;

            var requestUrl      = new Uri("http://fakeSite.fake/");
            var recordedRequest = new RecordedRequest
            {
                Url                = "http://fakeSite.fake/",
                Method             = "GET",
                ResponseStatusCode = HttpStatusCode.Found
            };

            var recordingSession = new RecordingSession {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest
                }
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession)
            {
                OnMatch = (recordedReq, interceptedReq, httpWebResponse, exception) =>
                {
                    recordedReq.ShouldEqual(recordedRequest);
                    interceptedReq.HttpWebRequest.RequestUri.ShouldEqual(new Uri(recordedRequest.Url));
                    httpWebResponse.StatusCode.ShouldEqual(recordedRequest.ResponseStatusCode);

                    matchCallCount++;
                }
            };

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = creator.Create(requestUrl);

            // ACT
            var response = request.GetResponse();

            // ASSERT
            response.ShouldNotBeNull();

            matchCallCount.ShouldEqual(1);
        }
        public void CanPlaybackDeflatedResponse()
        {
            // ARRANGE
            var recordedRequest = new RecordedRequest
            {
                Url          = "http://fakeSite.fake",
                Method       = "GET",
                ResponseBody = new RecordedStream
                {
                    SerializedStream    = "Response 1",
                    IsDeflateCompressed = true
                },
                ResponseHeaders = new RecordedHeaders
                {
                    { "Content-Encoding", new [] { "deflate" } }
                }
            };

            var recordingSession = new RecordingSession
            {
                RecordedRequests = new List <RecordedRequest> {
                    recordedRequest
                }
            };

            var requestBuilder = new RecordingSessionInterceptorRequestBuilder(recordingSession);

            IWebRequestCreate creator = new HttpWebRequestWrapperInterceptorCreator(requestBuilder);

            var request = (HttpWebRequest)creator.Create(new Uri(recordedRequest.Url));

            request.AutomaticDecompression = DecompressionMethods.Deflate;

            // ACT
            var response = request.GetResponse();

            // ASSERT
            response.ShouldNotBeNull();

            using (var sr = new StreamReader(response.GetResponseStream()))
                sr.ReadToEnd().ShouldEqual(recordedRequest.ResponseBody.SerializedStream);
        }