public async Task When_Disposed_Then_the_FakeServer_releases_its_port()
        {
            Uri baseAddress;

            Func <Task <HttpResponseMessage> > makeRequest;

            using (var fakeService = new FakeHttpService()
                                     .OnRequest(r => true)
                                     .RespondWith(async r => { await Task.Yield(); }))
            {
                baseAddress = fakeService.BaseAddress;

                makeRequest = async() => await new HttpClient().GetAsync(baseAddress);

                var firstResponse = await makeRequest();

                firstResponse.EnsureSuccessStatusCode();
            }

            Action makeAnotherRequest = () =>
            {
                makeRequest().Wait();
            };

            makeAnotherRequest.ShouldThrow <HttpRequestException>("Because the port should no longer be available.");
        }
Beispiel #2
0
 static PlaylistServiceFactory()
 {
     SettingsProvider = new SerialisationSettingsProvider();
     EndpointProvider = new EndpointProvider();
     HttpService      = new FakeHttpService(SettingsProvider);
     TokenService     = new FakeTokenService(Guid.NewGuid().ToString());
 }
        public void When_GetServiceMockById_called_with_registered_port_Then_returns_registered_MockService()
        {
            var mockService = new FakeHttpService();

            FakeHttpServiceRepository.GetServiceMockById(mockService.ServiceId)
            .Should().Be(mockService, "Because the MockService self-registered.");

            FakeHttpServiceRepository.Unregister(mockService);
        }
        public void When_Unregister_called_with_registered_MockService_Then_removes_MockService()
        {
            var mockService = new FakeHttpService();

            FakeHttpServiceRepository.Unregister(mockService);

            FakeHttpServiceRepository.GetServiceMockById(mockService.ServiceId)
            .Should().BeNull("Because the mockService was unregistered");
        }
        public void When_Register_called_with_registered_MockService_Then_throws_with_useful_message()
        {
            var mockService = new FakeHttpService();

            Action register = () => FakeHttpServiceRepository.Register(mockService);

            register
            .ShouldThrow <InvalidOperationException>("Because that MockService is already registered")
            .WithMessage("ServiceId in use", "Because that helps debug the issue");
        }
        public static FakeHttpService WithContentAt(this FakeHttpService subject, string relativeUri, string content)
        {
            subject
            .OnRequest(r => r.GetUri().ToString().EndsWith(relativeUri))
            .RespondWith(async r =>
            {
                await r.Body.WriteTextAsUtf8BytesAsync(content);
            });

            return(subject);
        }
        public async Task When_requesting_a_registered_Uri_Then_the_expected_response_is_returned()
        {
            using (var fakeService = new FakeHttpService()
                                     .OnRequest(r => true)
                                     .RespondWith(async r => { await Task.Yield(); }))
            {
                var response = await new HttpClient().GetAsync(fakeService.BaseAddress);

                response.EnsureSuccessStatusCode();
            }
        }
        public async void When_specifying_content_for_a_relative_Uri_Then_that_content_is_returned()
        {
            using (var fakeService = new FakeHttpService()
                                     .WithContentAt("/foo/bar/zap.zip", "quick brown fox"))
            {
                var response = await new HttpClient().GetAsync(fakeService.BaseAddress + "/foo/bar/zap.zip");

                var body = await response.Content.ReadAsStringAsync();

                body.Should().Be("quick brown fox");
            }
        }
        public void When_Unregister_called_with_unregistered_MockService_Then_throws_with_useful_message()
        {
            var mockService = new FakeHttpService();

            FakeHttpServiceRepository.Unregister(mockService);

            Action unregister = () => FakeHttpServiceRepository.Unregister(mockService);

            unregister
            .ShouldThrow <InvalidOperationException>("Because that MockService was not registered")
            .WithMessage("MockService not registered", "Because that helps debug the issue");
        }
        private void Test_Get_Current_Project_Without_Persisted_Id()
        {
            var tracker       = GetTracker();
            var returnProject = new PivotalProject {
                Id = 1, Name = "Project 1", Public = true
            };
            var response = CreateResponse(returnProject);

            FakeHttpService.Setup(x => x.GetAsync(It.IsAny <string>())).Returns(Task.FromResult(response));

            var project = tracker.GetCurrentProjectAsync(1);

            Assert.NotNull(project);
        }
        private void Test_Search_By_Query()
        {
            var tracker       = GetTracker();
            var returnStories = new PivotalSearchModel {
                Query = "label: \"my label\""
            };
            var response = CreateResponse(returnStories);

            FakeHttpService.Setup(x => x.GetAsync(It.IsAny <string>())).Returns(Task.FromResult(response));

            var query         = "label: \"my label\"";
            var searchStories = tracker.SearchByQueryAsync(1, query);

            Assert.Equal(query, searchStories.Result.Query);
        }
        public void Test_PivotalTracker_Authentication_Sets_ApiToken()
        {
            var tracker    = GetTracker();
            var returnUser = new PivotalUser
            {
                Username = "******",
                ApiToken = "MyToken"
            };
            var response = CreateResponse(returnUser);

            FakeHttpService.Setup(x => x.AuthorizeAsync(It.IsAny <string>(), It.IsAny <string>())).Returns(Task.FromResult(response));
            var auth = tracker.AuthorizeAsync("test", "test").Result;

            Assert.Equal(returnUser.ApiToken, tracker.ApiToken);
        }
        public async Task When_response_includes_a_body_Then_it_is_returned()
        {
            using (var fakeService = new FakeHttpService()
                                     .OnRequest(r => true)
                                     .RespondWith(async r =>
            {
                await r.Body.WriteTextAsUtf8BytesAsync("foo bar zap");
            }))
            {
                var response = await new HttpClient().GetAsync(fakeService.BaseAddress);

                var body = await response.Content.ReadAsStringAsync();

                body.Should().Be("foo bar zap");
            }
        }
        public void When_request_condition_met_Then_provides_response_with_baseAddress()
        {
            var path = new Uri("/some/path", UriKind.Relative);

            using (var fakeService = new FakeHttpService()
                                     .OnRequest(r => r.Path.ToString() == path.ToString())
                                     .RespondWith(async(r, s) => await r.Body.WriteTextAsUtf8BytesAsync(s.AbsolutePath)))
            {
                var client = new HttpClient {
                    BaseAddress = fakeService.BaseAddress
                };

                client.GetStringAsync(path).Result
                .Should().Be(fakeService.BaseAddress.AbsolutePath);
            }
        }
        public void When_request_not_expected_Then_responds_404()
        {
            HttpResponseMessage response;

            using (var fakeService = new FakeHttpService())
            {
                var client = new HttpClient {
                    BaseAddress = fakeService.BaseAddress
                };

                response = client.GetAsync("").Result;
            }

            response.StatusCode.
            Should().Be(System.Net.HttpStatusCode.NotFound, "Because the request was not expected");
        }
        public async Task When_filtering_Uri_Then_the_expected_response_is_returned()
        {
            using (var fakeService = new FakeHttpService()
                                     .OnRequest()
                                     .WhereUri(uri => uri.ToString().EndsWith("customapicall"))
                                     .Then()
                                     .RespondWith(async r =>
            {
                r.StatusCode = 200;
                await Task.Yield();
            }))
            {
                var response = await new HttpClient().GetAsync(new Uri(fakeService.BaseAddress, "/customapicall"));

                response.EnsureSuccessStatusCode();
            }
        }
        public async Task When_filtering_body_as_json_Then_the_expected_response_is_returned()
        {
            using (var fakeService = new FakeHttpService()
                                     .OnRequest()
                                     .WhereBodyAsJson(body => JToken.DeepEquals(body, JToken.Parse("{ field: 1}")))
                                     .Then()
                                     .Succeed()
                                     .FailOnUnexpectedRequest())
            {
                var response = await new HttpClient().PostAsync(new Uri(fakeService.BaseAddress, "/customapicall"), new StringContent("{ field: 1}"));

                response.EnsureSuccessStatusCode();

                response = await new HttpClient().PostAsync(new Uri(fakeService.BaseAddress, "/customapicall"), new StringContent("{}"));

                response.StatusCode.Should().Be(HttpStatusCode.InternalServerError);
            }
        }
        public void Test_PivotalTracker_Authentication_With_Credentials_Returns_User()
        {
            var tracker    = GetTracker();
            var returnUser = new PivotalUser
            {
                Username = "******",
                ApiToken = "MyToken"
            };
            var response = CreateResponse(returnUser);

            FakeHttpService.Setup(x => x.AuthorizeAsync(It.IsAny <string>(), It.IsAny <string>())).Returns(Task.FromResult(response));
            tracker.AuthorizeAsync("testUser", "testPassword");
            FakeHttpService.Setup(x => x.GetAsync(It.IsAny <string>())).Returns(Task.FromResult(response));

            var user = tracker.GetUserAsync().Result;

            Assert.Equal(user.ApiToken, returnUser.ApiToken);
        }
        public async Task When_filtering_body_as_POCO_Then_the_expected_response_is_returned()
        {
            using (var fakeService = new FakeHttpService()
                                     .OnRequest()
                                     .WhereBodyAs <SamplePOCO>(obj => obj.Value == "defined")
                                     .Then()
                                     .Succeed()
                                     .FailOnUnexpectedRequest())
            {
                var response = await new HttpClient().PostAsync(new Uri(fakeService.BaseAddress, "/customapicall"), new StringContent(JsonConvert.SerializeObject(new SamplePOCO("defined"))));

                response.EnsureSuccessStatusCode();

                response = await new HttpClient().PostAsync(new Uri(fakeService.BaseAddress, "/customapicall"), new StringContent(JsonConvert.SerializeObject(new SamplePOCO("undefined"))));

                response.StatusCode.Should().Be(HttpStatusCode.InternalServerError);
            }
        }
        public async Task When_response_includes_headers_Then_they_are_returned()
        {
            using (var fakeService = new FakeHttpService()
                                     .OnRequest(r => true)
                                     .RespondWith(async r =>
            {
                r.Headers.Append("foo", "bar");
                r.Headers.Append("colors", new StringValues(new[] { "red", "green", "blue" }));
                await Task.Yield();
            }))
            {
                var response = await new HttpClient().GetAsync(fakeService.BaseAddress);

                response.Headers.GetValues("foo").Should().BeEquivalentTo("bar");

                response.Headers.GetValues("colors").Should().BeEquivalentTo("red", "green", "blue");
            }
        }
        public async Task When_filtering_body_Then_the_expected_response_is_returned()
        {
            using (var fakeService = new FakeHttpService()
                                     .OnRequest()
                                     .WhereBodyAsString(body => body == "nothing")
                                     .Then()
                                     .Succeed()
                                     .FailOnUnexpectedRequest())
            {
                var response = await new HttpClient().PostAsync(new Uri(fakeService.BaseAddress, "/customapicall"), new StringContent("nothing"));

                response.EnsureSuccessStatusCode();

                response = await new HttpClient().PostAsync(new Uri(fakeService.BaseAddress, "/customapicall"), new StringContent("different"));

                response.StatusCode.Should().Be(HttpStatusCode.InternalServerError);
            }
        }
        public void Test_Get_User_Returns_User()
        {
            var tracker    = GetTracker();
            var returnUser = new PivotalUser
            {
                Email    = "*****@*****.**",
                Id       = 27,
                Initials = "TU",
                Name     = "Test User",
                Username = "******"
            };
            var response = CreateResponse(returnUser);

            FakeHttpService.Setup(x => x.GetAsync(It.IsAny <string>())).Returns(Task.FromResult(response));

            var user = tracker.GetUserAsync().Result;

            Assert.Equal(returnUser.Id, user.Id);
        }
        public async Task Request_information_is_sent_to_PocketLogger()
        {
            var log = new List <string>();

            using (var fakeService = new FakeHttpService()
                                     .OnRequest(r => true)
                                     .RespondWith(async r =>
            {
                r.Headers.Add("a-response-header", "a-response-header-value");
                await r.WriteAsync(JsonConvert.SerializeObject(new { ResponseProperty = "response-property-value" }));
            }))
                using (LogEvents.Subscribe(e => log.Add(e.ToLogString())))
                {
                    await new HttpClient().PostAsync(
                        new Uri(fakeService.BaseAddress, "/and/the/path?and=query"),
                        new StringContent(JsonConvert.SerializeObject(new { RequestProperty = "request-property-value" }), Encoding.UTF8, "application/json"));
                }

            log.Should()
            .HaveCount(2);

            log[0]
            .NormalizeLineEndings()
            .Should()
            .Match(@"*[FakeHttpService.RequestLoggingMiddleware] [Invoke]  ▶ 
  POST http://127.0.0.1:*/and/the/path?and=query
    Connection: Keep-Alive
    Content-Type: application/json; charset=utf-8
    Host: 127.0.0.1:*
    Content-Length: *
  {""RequestProperty"":""request-property-value""}*".NormalizeLineEndings());

            log[1]
            .NormalizeLineEndings()
            .Should()
            .Match(@"*[FakeHttpService.RequestLoggingMiddleware] [Invoke]  ⏹ -> ✔ (*ms) 
  HTTP/ 200
    a-response-header: a-response-header-value
  {""ResponseProperty"":""response-property-value""}*".NormalizeLineEndings());
        }
        public void Test_Get_Projects_Returns_Projects()
        {
            var tracker        = GetTracker();
            var returnProjects = new List <PivotalProject>
            {
                new PivotalProject {
                    Id = 1, Name = "Project 1", Public = true
                },
                new PivotalProject {
                    Id = 2, Name = "Project 2", Public = false
                },
                new PivotalProject {
                    Id = 3, Name = "Project 3", Public = false
                }
            };
            var response = CreateResponse(returnProjects);

            FakeHttpService.Setup(x => x.GetAsync(It.IsAny <string>())).Returns(Task.FromResult(response));

            var projects = tracker.GetProjectsAsync().Result;

            Assert.Equal(3, projects.Count);
        }
        private void Test_Get_Project_Stories()
        {
            var tracker       = GetTracker();
            var returnStories = new List <PivotalStory>
            {
                new PivotalStory {
                    Id = 1, Name = "Story 1"
                },
                new PivotalStory {
                    Id = 2, Name = "Story 2"
                },
                new PivotalStory {
                    Id = 3, Name = "Story 3"
                },
            };
            var response = CreateResponse(returnStories);

            FakeHttpService.Setup(x => x.GetAsync(It.IsAny <string>())).Returns(Task.FromResult(response));

            var stories = tracker.GetProjectStoriesAsync(1);

            Assert.NotNull(stories);
        }
        public void When_request_condition_met_Then_provides_response()
        {
            const string responseBody = "a quick brown fox";

            var path = new Uri("/some/path", UriKind.Relative);

            using (var fakeService = new FakeHttpService()
                                     .OnRequest(r => r.Path.ToString() == path.ToString())
                                     .RespondWith(async r =>
            {
                r.StatusCode = 200;
                r.ContentType = "text/plain";
                await r.Body.WriteTextAsUtf8BytesAsync(responseBody);
            }))
            {
                var client = new HttpClient {
                    BaseAddress = fakeService.BaseAddress
                };

                client.GetStringAsync(path).Result
                .Should().Be(responseBody);
            }
        }
        public async Task When_an_expected_request_is_not_made_but_FakeServer_is_configured_to_throw_Then_an_exception_is_thrown()
        {
            Uri address = null;

            Action createServiceWithoutInvoking = () =>
            {
                using (var fakeService = new FakeHttpService(
                           "my service",
                           throwOnUnusedHandlers: true)
                                         .OnRequest(r => r.Path == "foo")
                                         .RespondWith(async r => { await Task.Yield(); }))
                {
                    address = fakeService.BaseAddress;
                }
            };

            createServiceWithoutInvoking
            .ShouldThrow <InvalidOperationException>(
                "Because failing to perform a request can be an error")
            .Which
            .Message
            .Should()
            .StartWith($"{nameof(FakeHttpService)} \"my service\" @ {address} expected requests");
        }
        public void When_request_processing_throws_an_exception_Then_responds_500_with_exception_body()
        {
            const string exceptionMessage = "exception!";

            HttpResponseMessage response;

            using (var fakeService = new FakeHttpService()
                                     .OnRequest(r => true)
                                     .RespondWith(r => throw new Exception(exceptionMessage)))
            {
                var client = new HttpClient {
                    BaseAddress = fakeService.BaseAddress
                };

                response = client.GetAsync("").Result;
            }

            response.StatusCode
            .Should().Be(System.Net.HttpStatusCode.InternalServerError,
                         "Because request processing threw an exception");

            response.Content.ReadAsStringAsync().Result
            .Should().Contain(exceptionMessage);
        }
 public RequestFilterExpressionBuilder(FakeHttpService fakeHttpService)
 {
     _fakeHttpService = fakeHttpService;
 }
 public static RequestFilterExpressionBuilder OnRequest(this FakeHttpService service)
 {
     return(new RequestFilterExpressionBuilder(service));
 }