public void Compare_WithNonMatchingHeaderNames_OneErrorIsAddedToTheComparisonResult() { 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", "Tester" } } }; var comparer = GetSubject(); var result = comparer.Compare(expected, actual); Assert.Equal(1, result.Failures.Count()); }
public void Handle_WithNancyContext_ConvertIsCalledOnTheNancyResponseMapper() { 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); _mockResponseMapper.Received(1).Convert(expectedResponse); }
private void ClearTrasientState() { _request = null; _response = null; _providerState = null; _description = null; }
public void WillRespondWith_WithValidInteraction_PerformsAdminInteractionsPostRequestWithTestContext() { var providerState = "My provider state"; var description = "My description"; var request = new ProviderServiceRequest { Method = HttpVerb.Head, Path = "/tester/testing/1" }; var response = new ProviderServiceResponse { Status = (int)HttpStatusCode.ProxyAuthenticationRequired }; var mockService = GetSubject(); mockService.Start(); mockService .Given(providerState) .UponReceiving(description) .With(request) .WillRespondWith(response); var actualRequest = _fakeHttpMessageHandler.RequestsReceived.Single(); Assert.Equal("MockProviderServiceTests.WillRespondWith_WithValidInteraction_PerformsAdminInteractionsPostRequestWithTestContext", actualRequest.Headers.Single(x => x.Key == Constants.AdministrativeRequestTestContextHeaderKey).Value.Single()); }
public void WillRespondWith_WithResponseThatContainsABodyAndNoContentType_ThrowsArgumentException() { var providerState = "My provider state"; var description = "My description"; var request = new ProviderServiceRequest { Method = HttpVerb.Get }; var response = new ProviderServiceResponse { Status = (int)HttpStatusCode.OK, Body = new { tester = 1 } }; var mockService = GetSubject(); mockService .Given(providerState) .UponReceiving(description) .With(request); Assert.Throws <ArgumentException>(() => mockService.WillRespondWith(response)); }
public void Compare_WithMatchingObjectBodyButResponseHasAdditionalProperties_NoExceptionsAreThrown() { var expected = new ProviderServiceResponse { Status = 201, Body = new { myString = "Tester", myInt = 1, myGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C") } }; var actual = new ProviderServiceResponse { Status = 201, Body = new { myString = "Tester", myInt = 1, myGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C"), additional = "Hello" } }; var comparer = GetSubject(); comparer.Compare(expected, actual); }
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_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); }
public void WhenRegisteringTheSameInteractionTwiceInATest_ThenPactFailureExceptionIsThrown() { var description = "A POST request to create a new thing"; var request = new ProviderServiceRequest { Method = HttpVerb.Post, Path = "/things", Headers = new Dictionary <string, string> { { "Content-Type", "application/json; charset=utf-8" } }, Body = new { thingId = 1234, type = "Awesome" } }; var response = new ProviderServiceResponse { Status = 201 }; _mockProviderService .UponReceiving(description) .With(request) .WillRespondWith(response); _mockProviderService .UponReceiving(description) .With(request); Assert.Throws <PactFailureException>(() => _mockProviderService.WillRespondWith(response)); }
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_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 Compare_WithMatchingHeadersButWithDifferentCasingOnName_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> { { "Content-Type", "application/json" } } }; var comparer = GetSubject(); var result = comparer.Compare(expected, actual); Assert.False(result.HasFailure, "There should not be any errors"); }
public void Compare_WithMatchingObjectHoweverPropertyNameCasingIsDifferent_OneErrorIsAddedToTheComparisonResult() { var expected = new ProviderServiceResponse { Status = 201, Body = new { MyString = "Tester", MyInt = 1, MyGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C") } }; var actual = new ProviderServiceResponse { Status = 201, Body = new { myString = "Tester", myInt = 1, myGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C") } }; var comparer = GetSubject(); var result = comparer.Compare(expected, actual); Assert.Equal(1, result.Failures.Count()); }
public void Compare_WithMatchingObjectBodyButResponseHasAdditionalProperties_NoErrorsAreAddedToTheComparisonResult() { var expected = new ProviderServiceResponse { Status = 201, Body = new { myString = "Tester", myInt = 1, myGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C") } }; var actual = new ProviderServiceResponse { Status = 201, Body = new { myString = "Tester", myInt = 1, myGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C"), additional = "Hello" } }; var comparer = GetSubject(); var result = comparer.Compare(expected, actual); Assert.False(result.HasFailure, "There should not be any errors"); }
public void Compare_WithMatchingHeadersButResponseHasAdditionalHeaders_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> { { "X-Test", "MyCustomThing" }, { "X-Test-2", "MyCustomThing2" }, { "Content-Type", "application/json" } } }; var comparer = GetSubject(); comparer.Compare(expected, actual); }
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 void Compare_WithNonMatchingHeaderNames_ReportErrorIsCalled() { 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", "Tester" } } }; var comparer = GetSubject(); comparer.Compare(expected, actual); _mockReporter.Received(1).ReportError(Arg.Any <string>(), Arg.Any <object>(), Arg.Any <object>()); }
public void WillRespondWith_WhenExistingInteractionExistAndWeHaveAnotherValidInteraction_InteractionIsAdded() { var providerState = "My provider state"; var description = "My description"; var request = new ProviderServiceRequest(); var response = new ProviderServiceResponse(); var mockService = GetSubject(); mockService .UponReceiving("My previous description") .With(new ProviderServiceRequest()) .WillRespondWith(new ProviderServiceResponse()); mockService .Given(providerState) .UponReceiving(description) .With(request) .WillRespondWith(response); var interaction = mockService.Interactions.Last() as ProviderServiceInteraction; Assert.Equal(2, mockService.Interactions.Count()); Assert.Equal(providerState, interaction.ProviderState); Assert.Equal(description, interaction.Description); Assert.Equal(request, interaction.Request); Assert.Equal(response, interaction.Response); }
public void Compare_WithMatchingObjectHoweverPropertyNameCasingIsDifferent_ReportErrorIsCalled() { var expected = new ProviderServiceResponse { Status = 201, Body = new { MyString = "Tester", MyInt = 1, MyGuid = Guid.Parse("EEB517E6-AC8B-414A-A0DB-6147EAD9193C") } }; var actual = new ProviderServiceResponse { Status = 201, Body = new { myString = "Tester", 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 WillRespondWith_WhenAddingADuplicateInteractionAfterClearingInteractions_TheDuplicateInteractionIsNotAdded() { var providerState = "My provider state"; var description = "My description"; var request = new ProviderServiceRequest(); var response = new ProviderServiceResponse(); var mockService = GetSubject(); mockService .Given(providerState) .UponReceiving(description) .With(request) .WillRespondWith(response); var expectedInteractions = mockService.Interactions; mockService.ClearInteractions(); mockService .Given(providerState) .UponReceiving(description) .With(request) .WillRespondWith(response); var actualIneractions = mockService.Interactions; Assert.Equal(1, actualIneractions.Count()); Assert.Equal(expectedInteractions.First(), actualIneractions.First()); }
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 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); }
public void With_WithRequest_SetsRequest() { var description = "My description"; var request = new ProviderServiceRequest { Method = HttpVerb.Head, Path = "/tester/testing/1" }; var response = new ProviderServiceResponse { Status = (int)HttpStatusCode.ProxyAuthenticationRequired }; var expectedInteraction = new ProviderServiceInteraction { Description = description, Request = request, Response = response }; var expectedInteractionJson = expectedInteraction.AsJsonString(); var mockService = GetSubject(); mockService.Start(); mockService.UponReceiving(description) .With(request) .WillRespondWith(response); var actualInteractionJson = _fakeHttpMessageHandler.RequestContentRecieved.Single(); Assert.Equal(expectedInteractionJson, actualInteractionJson); }
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().RunSync(); if (responseContent != null) { var httpBodyContent = _httpBodyContentMapper.Convert(content: responseContent, headers: to.Headers); to.Body = httpBodyContent.Body; } } return(to); }
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 SerializeObject_WithCamelCaseApiSerializerSettings_ReturnsCorrectJson() { var response = new ProviderServiceResponse { Status = 200, Headers = new Dictionary <string, object> { { "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 void GetAllCars_WhenCalled_ReturnsAllEvents() { var test = new[] { new { carId = Guid.Parse("45D80D13-D5A2-48D7-8353-CBB4C0EAABF5"), mileage1 = 0, fuel = "Gasoline" }, new { carId = Guid.Parse("83F9262F-28F1-4703-AB1A-8CFD9E8249C9"), mileage1 = 0, fuel = "Gasoline" }, new { carId = Guid.Parse("3E83A96B-2A0C-49B1-9959-26DF23F83AEB"), mileage1 = 15000, fuel = "Diesel" } }; var res = new ProviderServiceResponse { Status = 200, Headers = new Dictionary <string, object> { { "Content-Type", "application/json; charset=utf-8" } }, Body = test }; //Arrange _mockProviderService.Given("there are cars with ids '45D80D13-D5A2-48D7-8353-CBB4C0EAABF5', '83F9262F-28F1-4703-AB1A-8CFD9E8249C9' and '3E83A96B-2A0C-49B1-9959-26DF23F83AEB'") .UponReceiving("a request to retrieve all cars") .With(new ProviderServiceRequest { Method = HttpVerb.Get, Path = "/cars", Headers = new Dictionary <string, object> { { "Accept", "application/json" }, } }) .WillRespondWith(res); var consumer = new CarsApiClient(_mockProviderServiceBaseUri); //Act var events = consumer.GetAllCars(); //Assert Assert.NotEmpty(events); Assert.Equal(3, events.Count()); _mockProviderService.VerifyInteractions(); }
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 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"); }