public void Compare(ProviderServiceResponse response1, ProviderServiceResponse response2) { if (response1 == null) { _reporter.ReportError("Expected response cannot be null"); return; } _reporter.ReportInfo(String.Format("{0} has status code of {1}", MessagePrefix, response1.Status)); if (!response1.Status.Equals(response2.Status)) { _reporter.ReportError(expected: response1.Status, actual: response2.Status); } if (response1.Headers != null && response1.Headers.Any()) { _httpHeaderComparer.Compare(response1.Headers, response2.Headers); } if (response1.Body != null) { string expectedResponseBodyJson = JsonConvert.SerializeObject(response1.Body); string actualResponseBodyJson = JsonConvert.SerializeObject(response2.Body); var actualResponseBody = JsonConvert.DeserializeObject<JToken>(actualResponseBodyJson); var expectedResponseBody = JsonConvert.DeserializeObject<JToken>(expectedResponseBodyJson); _httpBodyComparer.Validate(expectedResponseBody, actualResponseBody); } }
public void Compare_WithMatchingHeadersButResponseHasAdditionalHeaders_NoErrorsAreAddedToTheComparisonResult() { var expected = new ProviderServiceResponse { Status = 201, Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } } }; var actual = new ProviderServiceResponse { Status = 201, Headers = new Dictionary<string, string> { { "X-Test", "MyCustomThing" }, { "X-Test-2", "MyCustomThing2" }, { "Content-Type", "application/json" } } }; var comparer = GetSubject(); var result = comparer.Compare(expected, actual); Assert.False(result.HasFailure, "There should not be any errors"); }
public Response Handle(NancyContext context) { try { var response = HandlePactRequest(context); return response; } catch (Exception ex) { var exceptionMessage = ex.Message .Replace("\r", " ") .Replace("\n", "") .Replace("\t", " ") .Replace(@"\", ""); var errorResponse = new ProviderServiceResponse { Status = 500, Body = exceptionMessage }; var response = _responseMapper.Convert(errorResponse); response.ReasonPhrase = exceptionMessage; return response; } }
public ProviderServiceResponse Convert(HttpResponseMessage from) { if (from == null) { return null; } var to = new ProviderServiceResponse { Status = (int) from.StatusCode, Headers = ConvertHeaders(from.Headers, from.Content) }; if(from.Content != null) { var responseContent = from.Content.ReadAsByteArrayAsync().Result; if (responseContent != null) { var httpBodyContent = _httpBodyContentMapper.Convert(content: responseContent, headers: to.Headers); to.Body = httpBodyContent.Body; } } return to; }
public ComparisonResult Compare(ProviderServiceResponse expected, ProviderServiceResponse actual) { var result = new ComparisonResult("returns a response which"); if (expected == null) { result.RecordFailure(new ErrorMessageComparisonFailure("Expected response cannot be null")); return result; } var statusResult = _httpStatusCodeComparer.Compare(expected.Status, actual.Status); result.AddChildResult(statusResult); if (expected.Headers != null && expected.Headers.Any()) { var headerResult = _httpHeaderComparer.Compare(expected.Headers, actual.Headers); result.AddChildResult(headerResult); } if (expected.Body != null) { var bodyResult = _httpBodyComparer.Compare(expected.Body, actual.Body, expected.MatchingRules); result.AddChildResult(bodyResult); } else if (expected.Body == null && expected.ShouldSerializeBody() && //Body was explicitly set actual.Body != null) { result.RecordFailure(new ErrorMessageComparisonFailure("Expected response body was explicitly set to null however the actual response body was not null")); } return result; }
public void SerializeObject_WithDefaultApiSerializerSettingsAndNoHeadersOrBody_ReturnsCorrectJson() { var response = new ProviderServiceResponse { Status = 500 }; var responseJson = JsonConvert.SerializeObject(response, JsonConfig.ApiSerializerSettings); var expectedJson = "{\"status\":500}"; Assert.Equal(expectedJson, responseJson); }
public void Compare_WithMatchingStatusCodes_NoExceptionsAreThrown() { var expected = new ProviderServiceResponse { Status = 201 }; var actual = new ProviderServiceResponse { Status = 201 }; var comparer = GetSubject(); comparer.Compare(expected, actual); }
public void Compare_WithNonMatchingStatusCodes_ReportErrorIsCalled() { var expected = new ProviderServiceResponse { Status = 201 }; var actual = new ProviderServiceResponse { Status = 400 }; var comparer = GetSubject(); comparer.Compare(expected, actual); _mockReporter.Received(1).ReportError(Arg.Any<string>(), Arg.Any<object>(), Arg.Any<object>()); }
public void SerializeObject_WithDefaultApiSerializerSettings_ReturnsCorrectJson() { var request = new ProviderServiceResponse { Status = 200, Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }, Body = new { Test1 = "hi", test2 = 2 } }; var responseJson = JsonConvert.SerializeObject(request, JsonConfig.ApiSerializerSettings); var expectedJson = "{\"status\":200,\"headers\":{\"Content-Type\":\"application/json\"},\"body\":{\"Test1\":\"hi\",\"test2\":2}}"; Assert.Equal(expectedJson, responseJson); }
public void Convert_WithJsonBody_CallsConvertOnHttpBodyContentMapperAndAssignsContents() { const string contentTypeString = "application/json"; var response = new ProviderServiceResponse { Status = 200, Headers = new Dictionary<string, string> { { "Content-Type", contentTypeString } }, Body = new { Test = "tester", Test2 = 1 } }; var jsonBody = "{\"Test\":\"tester\",\"Test2\":1}"; var httpBodyContent = new HttpBodyContent(content: Encoding.UTF8.GetBytes(jsonBody), contentType: contentTypeString, encoding: null); var mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>(); mockHttpBodyContentMapper.Convert(body: Arg.Any<object>(), headers: response.Headers) .Returns(httpBodyContent); var mapper = new NancyResponseMapper(mockHttpBodyContentMapper); var result = mapper.Convert(response); string content; using (var stream = new MemoryStream()) { result.Contents(stream); stream.Position = 0; using (var reader = new StreamReader(stream)) { content = reader.ReadToEnd(); } } Assert.Equal(jsonBody, content); mockHttpBodyContentMapper.Received(1).Convert(body: Arg.Any<object>(), headers: response.Headers); }
public void SerializeObject_WithCamelCaseApiSerializerSettings_ReturnsCorrectJson() { var response = new ProviderServiceResponse { Status = 200, Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } }, Body = new { Test1 = "hi", test2 = 2 } }; var responseJson = JsonConvert.SerializeObject(response, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.None, ContractResolver = new CamelCasePropertyNamesContractResolver() }); var expectedJson = "{\"status\":200,\"headers\":{\"Content-Type\":\"application/json\"},\"body\":{\"test1\":\"hi\",\"test2\":2}}"; Assert.Equal(expectedJson, responseJson); }
public Response Handle(NancyContext context) { //TODO: This is a hack and should probably go in VerifyInteractions() if (!_injected) { _requestComparer = new ProviderServiceRequestComparer(new Reporter()); } var reporter = _requestComparer.GetReporter(); try { var response = HandlePactRequest(context); reporter.ThrowIfAnyErrors(); return response; } catch (Exception ex) { var exceptionMessage = ex.Message .Replace("\r", " ") .Replace("\n", "") .Replace("\t", " ") .Replace(@"\", ""); var errorResponse = new ProviderServiceResponse { Status = 500, Body = exceptionMessage }; var response = _responseMapper.Convert(errorResponse); response.ReasonPhrase = exceptionMessage; return response; } }
public void Convert_WithPlainTextBody_CallsConvertOnHttpBodyContentMapperAndAssignsContents() { const string contentTypeString = "text/plain"; var response = new ProviderServiceResponse { Status = 200, Headers = new Dictionary<string, string> { { "Content-Type", contentTypeString } }, Body = "This is a plain body" }; var httpBodyContent = new HttpBodyContent(response.Body, contentTypeString, null); var mockHttpBodyContentMapper = Substitute.For<IHttpBodyContentMapper>(); mockHttpBodyContentMapper.Convert(body: Arg.Any<object>(), headers: response.Headers) .Returns(httpBodyContent); var mapper = new NancyResponseMapper(mockHttpBodyContentMapper); var result = mapper.Convert(response); string content; using (var stream = new MemoryStream()) { result.Contents(stream); stream.Position = 0; using (var reader = new StreamReader(stream)) { content = reader.ReadToEnd(); } } Assert.Equal(response.Body, content); mockHttpBodyContentMapper.Received(1).Convert(body: Arg.Any<object>(), headers: response.Headers); }
public void Compare_WithMatchingCollection_NoErrorsAreAddedToTheComparisonResult() { var expected = new ProviderServiceResponse { Status = 201, Body = new List<dynamic> { new { myString = "Tester", myInt = 1, myGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C") } } }; var actual = new ProviderServiceResponse { Status = 201, Body = new List<dynamic> { new { myString = "Tester", myInt = 1, myGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C") } } }; var comparer = GetSubject(); var result = comparer.Compare(expected, actual); Assert.False(result.HasFailure, "There should not be any errors"); }
public void Compare_WithMatchingHeaders_NoExceptionsAreThrown() { var expected = new ProviderServiceResponse { Status = 201, Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } } }; var actual = new ProviderServiceResponse { Status = 201, Headers = new Dictionary<string, string> { { "Content-Type", "application/json" } } }; var comparer = GetSubject(); comparer.Compare(expected, actual); }
public void Handle_WithNancyContext_ConvertIsCalledOnThProviderServiceRequestMapper() { var expectedRequest = new ProviderServiceRequest { Method = HttpVerb.Get, Path = "/" }; var expectedResponse = new ProviderServiceResponse(); var nancyContext = new NancyContext { Request = new Request("GET", "/", "HTTP") }; var mockRequestMapper = Substitute.For<IProviderServiceRequestMapper>(); var mockResponseMapper = Substitute.For<INancyResponseMapper>(); var mockProviderRepository = Substitute.For<IMockProviderRepository>(); mockRequestMapper.Convert(nancyContext.Request).Returns(expectedRequest); var interactions = new List<ProviderServiceInteraction> { new ProviderServiceInteraction { Request = expectedRequest, Response = expectedResponse} }; nancyContext.SetMockInteraction(interactions); IMockProviderRequestHandler handler = new MockProviderRequestHandler(mockRequestMapper, mockResponseMapper, mockProviderRepository); handler.Handle(nancyContext); mockRequestMapper.Received(1).Convert(nancyContext.Request); }
private bool BodyContentMatches(ProviderServiceResponse response, string expectedBody) { if (response.Body == expectedBody) { return true; } return false; }
public void Handle_WithNancyContextRequestThatMatchesExpectedRequest_ReturnsNancyResponse() { var expectedRequest = new ProviderServiceRequest { Method = HttpVerb.Get, Path = "/Test" }; var actualRequest = new ProviderServiceRequest { Method = HttpVerb.Get, Path = "/Test" }; var expectedResponse = new ProviderServiceResponse { Status = 200 }; var nancyResponse = new Response { StatusCode = HttpStatusCode.OK }; var mockRequestMapper = Substitute.For<IProviderServiceRequestMapper>(); var mockResponseMapper = Substitute.For<INancyResponseMapper>(); var mockProviderRepository = Substitute.For<IMockProviderRepository>(); var nancyContext = new NancyContext { Request = new Request("GET", "/Test", "HTTP") }; var interactions = new List<ProviderServiceInteraction> { new ProviderServiceInteraction { Request = expectedRequest, Response = expectedResponse } }; nancyContext.SetMockInteraction(interactions); mockRequestMapper.Convert(nancyContext.Request).Returns(actualRequest); //mockRequestComparer.Compare Doesnt throw any exceptions mockResponseMapper.Convert(expectedResponse).Returns(nancyResponse); IMockProviderRequestHandler handler = new MockProviderRequestHandler(mockRequestMapper, mockResponseMapper, mockProviderRepository); var response = handler.Handle(nancyContext); Assert.Equal(nancyResponse, response); }
public void Handle_WithNancyContext_AddHandledRequestIsCalledOnTheMockProviderRepository() { var expectedRequest = new ProviderServiceRequest { Method = HttpVerb.Get, Path = "/" }; var actualRequest = new ProviderServiceRequest { Method = HttpVerb.Get, Path = "/", Body = new {} }; var expectedResponse = new ProviderServiceResponse(); var handler = GetSubject(); var nancyContext = new NancyContext { Request = new Request("GET", "/", "HTTP") }; var interaction = new ProviderServiceInteraction { Request = expectedRequest, Response = expectedResponse }; _mockProviderRepository.GetMatchingTestScopedInteraction(Arg.Any<ProviderServiceRequest>()) .Returns(interaction); _mockRequestMapper.Convert(nancyContext.Request).Returns(actualRequest); handler.Handle(nancyContext); _mockProviderRepository.Received(1).AddHandledRequest(Arg.Is<HandledRequest>(x => x.ActualRequest == actualRequest && x.MatchedInteraction == interaction)); }
public void Compare_WithNonMatchingCollection_ReportErrorIsCalled() { var expected = new ProviderServiceResponse { Status = 201, Body = new List<dynamic> { new { myString = "Tester", myInt = 1, myGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C") } } }; var actual = new ProviderServiceResponse { Status = 201, Body = new List<dynamic> { new { myString = "Tester2", myInt = 1, myGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C") } } }; var comparer = GetSubject(); comparer.Compare(expected, actual); _mockReporter.Received(1).ReportError(Arg.Any<string>(), Arg.Any<object>(), Arg.Any<object>()); }
public void Handle_WithNancyContext_CompareIsCalledOnTheProviderServiceRequestComparer() { var expectedRequest = new ProviderServiceRequest(); var expectedResponse = new ProviderServiceResponse(); var actualRequest = new ProviderServiceRequest(); var mockRequestComparer = Substitute.For<IProviderServiceRequestComparer>(); var mockRequestMapper = Substitute.For<IProviderServiceRequestMapper>(); var mockResponseMapper = Substitute.For<INancyResponseMapper>(); var nancyContext = new NancyContext { Request = new Request("GET", "/", "HTTP") }; var interactions = new List<ProviderServiceInteraction> { new ProviderServiceInteraction { Request = expectedRequest, Response = expectedResponse } }; nancyContext.SetMockInteraction(interactions); mockRequestMapper.Convert(nancyContext.Request).Returns(actualRequest); IMockProviderNancyRequestHandler handler = new MockProviderNancyRequestHandler(mockRequestComparer, mockRequestMapper, mockResponseMapper); handler.Handle(nancyContext); mockRequestComparer.Received(1).Compare(expectedRequest, actualRequest); }
public void Handle_WithNancyContextRequestThatDoesNotMatchExpectedRequest_ResponseMapperIsCalledAndReturns500Response() { var expectedRequest = new ProviderServiceRequest { Method = HttpVerb.Get, Path = "/Test" }; var actualRequest = new ProviderServiceRequest { Method = HttpVerb.Put, Path = "/Test" }; var expectedResponse = new ProviderServiceResponse { Status = 200 }; var nancyResponse = new Response { StatusCode = HttpStatusCode.OK }; var compareException = new CompareFailedException("Something failed"); var mockRequestComparer = Substitute.For<IProviderServiceRequestComparer>(); var mockRequestMapper = Substitute.For<IProviderServiceRequestMapper>(); var mockResponseMapper = Substitute.For<INancyResponseMapper>(); var nancyContext = new NancyContext { Request = new Request("GET", "/Test", "HTTP") }; var interactions = new List<ProviderServiceInteraction> { new ProviderServiceInteraction { Request = expectedRequest, Response = expectedResponse } }; nancyContext.SetMockInteraction(interactions); mockRequestMapper.Convert(nancyContext.Request).Returns(actualRequest); mockRequestComparer .When(x => x.Compare(expectedRequest, actualRequest)) .Do(x => { throw compareException; }); mockResponseMapper.Convert(expectedResponse).Returns(nancyResponse); mockResponseMapper.Convert(Arg.Any<ProviderServiceResponse>()) .Returns(new Response { StatusCode = HttpStatusCode.InternalServerError }); IMockProviderNancyRequestHandler handler = new MockProviderNancyRequestHandler(mockRequestComparer, mockRequestMapper, mockResponseMapper); var response = handler.Handle(nancyContext); mockResponseMapper.Received(1).Convert(Arg.Is<ProviderServiceResponse>(x => x.Status == 500)); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); Assert.NotEmpty(response.ReasonPhrase); }
public void Handle_WithNancyContext_ConvertIsCalledOnThProviderServiceRequestMapper() { var expectedRequest = new ProviderServiceRequest { Method = HttpVerb.Get, Path = "/" }; var expectedResponse = new ProviderServiceResponse(); var nancyContext = new NancyContext { Request = new Request("GET", "/", "HTTP") }; var handler = GetSubject(); _mockRequestMapper.Convert(nancyContext.Request).Returns(expectedRequest); var interaction = new ProviderServiceInteraction { Request = expectedRequest, Response = expectedResponse }; _mockProviderRepository.GetMatchingTestScopedInteraction(expectedRequest) .Returns(interaction); handler.Handle(nancyContext); _mockRequestMapper.Received(1).Convert(nancyContext.Request); }
public void Compare_WithMatchingCollection_NoExceptionsAreThrown() { var expected = new ProviderServiceResponse { Status = 201, Body = new List<dynamic> { new { myString = "Tester", myInt = 1, myGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C") } } }; var actual = new ProviderServiceResponse { Status = 201, Body = new List<dynamic> { new { myString = "Tester", myInt = 1, myGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C") } } }; var comparer = GetSubject(); comparer.Compare(expected, actual); }
public void Handle_WithNancyContext_AddHandledRequestIsCalledOnTheMockProviderRepository() { var expectedRequest = new ProviderServiceRequest(); var expectedResponse = new ProviderServiceResponse(); var actualRequest = new ProviderServiceRequest(); var mockRequestMapper = Substitute.For<IProviderServiceRequestMapper>(); var mockResponseMapper = Substitute.For<INancyResponseMapper>(); var mockProviderRepository = Substitute.For<IMockProviderRepository>(); var nancyContext = new NancyContext { Request = new Request("GET", "/", "HTTP") }; var interactions = new List<ProviderServiceInteraction> { new ProviderServiceInteraction { Request = expectedRequest, Response = expectedResponse } }; nancyContext.SetMockInteraction(interactions); mockRequestMapper.Convert(nancyContext.Request).Returns(actualRequest); IMockProviderRequestHandler handler = new MockProviderRequestHandler(mockRequestMapper, mockResponseMapper, mockProviderRepository); handler.Handle(nancyContext); mockProviderRepository.Received(1).AddHandledRequest(Arg.Is<HandledRequest>(x => x.ActualRequest == actualRequest && x.MatchedInteraction == interactions.First())); }
public void Handle_WithNancyContextRequestThatMatchesExpectedRequest_ReturnsNancyResponse() { var expectedRequest = new ProviderServiceRequest { Method = HttpVerb.Get, Path = "/Test" }; var actualRequest = new ProviderServiceRequest { Method = HttpVerb.Get, Path = "/Test" }; var expectedResponse = new ProviderServiceResponse { Status = 200 }; var nancyResponse = new Response { StatusCode = HttpStatusCode.OK }; var handler = GetSubject(); var nancyContext = new NancyContext { Request = new Request("GET", "/Test", "HTTP") }; var interaction = new ProviderServiceInteraction { Request = expectedRequest, Response = expectedResponse }; _mockProviderRepository.GetMatchingTestScopedInteraction(Arg.Any<ProviderServiceRequest>()) .Returns(interaction); _mockRequestMapper.Convert(nancyContext.Request).Returns(actualRequest); //mockRequestComparer.Compare Doesnt throw any exceptions _mockResponseMapper.Convert(expectedResponse).Returns(nancyResponse); var response = handler.Handle(nancyContext); Assert.Equal(nancyResponse, response); }
public void Convert_WithResponseWithStatusCode_ReturnsNancyResponseWithStatusCode() { var response = new ProviderServiceResponse { Status = 200 }; var mapper = GetSubject(); var result = mapper.Convert(response); Assert.Equal(HttpStatusCode.OK, result.StatusCode); }
public void Convert_WithResponseThatHasANullBodyAndAContentLengthHeader_ReturnsNancyResponseWithNullBodyAndContentLengthHeader() { var response = new ProviderServiceResponse { Status = 200, Headers = new Dictionary<string, string> { { "Content-Length", "100" } } }; var mapper = GetSubject(); var result = mapper.Convert(response); var stream = new MemoryStream(); result.Contents(stream); Assert.Equal(0, stream.Length); Assert.Equal("Content-Length", result.Headers.Last().Key); Assert.Equal("100", result.Headers.Last().Value); stream.Close(); stream.Dispose(); }
public void Convert_WithResponseThatHasANullBodyAndACustomHeader_ReturnsNancyResponseWithHeaderAndDoesNotAddAContentLengthHeader() { var response = new ProviderServiceResponse { Status = 200, Headers = new Dictionary<string, string> { { "X-Test", "Tester" } } }; var mapper = GetSubject(); var result = mapper.Convert(response); Assert.Equal(response.Headers.First().Key, result.Headers.First().Key); Assert.Equal(response.Headers.First().Value, result.Headers.First().Value); Assert.Equal(1, result.Headers.Count()); }
public Response Convert(ProviderServiceResponse from) { if (from == null) { return null; } var to = new Response { StatusCode = (HttpStatusCode) from.Status, Headers = from.Headers ?? new Dictionary<string, string>() }; if (from.Body != null) { HttpBodyContent bodyContent = _httpBodyContentMapper.Convert(body: from.Body, headers: from.Headers); to.ContentType = bodyContent.ContentType; to.Contents = s => { byte[] bytes = bodyContent.ContentBytes; s.Write(bytes, 0, bytes.Length); s.Flush(); }; } return to; }