コード例 #1
0
        public static T WithTypedClients <T, TClient1, TClient2>(TeePeeBuilder <TClient1> teePeeBuilder1, TeePeeBuilder <TClient2> teePeeBuilder2, Action <IServiceCollection> setup = null) where T : class
            where TClient1 : class
            where TClient2 : class
        {
            var serviceCollection = new ServiceCollection();

            var teePeeMessageHandler1 = teePeeBuilder1.Build().HttpHandler;
            var teePeeMessageHandler2 = teePeeBuilder2.Build().HttpHandler;

            if (setup != null)
            {
                // Use your own Typed Client setup here
                setup(serviceCollection);
                serviceCollection.AddTrackingForTypedClient <TClient1>(teePeeMessageHandler1);
                serviceCollection.AddTrackingForTypedClient <TClient2>(teePeeMessageHandler2);
            }
            else
            {
                serviceCollection.AddHttpClient <TClient1>(_ => { })
                .AddHttpMessageHandler(_ => teePeeMessageHandler1);
                serviceCollection.AddHttpClient <TClient2>(_ => { })
                .AddHttpMessageHandler(_ => teePeeMessageHandler2);
            }

            serviceCollection.AddTransient <T>();

            return(serviceCollection.BuildServiceProvider().GetService <T>());
        }
コード例 #2
0
        public void WithUrlDoesNotThrowIfAbsolute(string absoluteUrl)
        {
            // Given
            var builder = new TeePeeBuilder();

            // When
            var ex = Record.Exception(() => builder.ForRequest(absoluteUrl, HttpMethod.Get));

            // Then
            Assert.Null(ex);
        }
コード例 #3
0
        public void ForRequestThrowsIfNotAbsolute(string relativeUrl)
        {
            // Given
            var builder = new TeePeeBuilder();

            // When
            var ex = Record.Exception(() => builder.ForRequest(relativeUrl, HttpMethod.Get));

            // Then
            Assert.IsType <ArgumentException>(ex);
            Assert.Contains("must be an absolute URI", ex.Message);
        }
コード例 #4
0
        public static T WithDefaultClient <T>(TeePeeBuilder teePeeBuilder) where T : class
        {
            var teePeeMessageHandler = teePeeBuilder.Build().HttpHandler;

            var serviceCollection = new ServiceCollection();

            serviceCollection.AddHttpClient(Options.DefaultName)
            .AddHttpMessageHandler(_ => teePeeMessageHandler);

            serviceCollection.AddTransient <T>();

            return(serviceCollection.BuildServiceProvider().GetService <T>());
        }
コード例 #5
0
        public void ContainingQueryParamThrowsIfUrlHasQueryString()
        {
            // Given
            var builder        = new TeePeeBuilder();
            var requestBuilder = builder.ForRequest("https://site.net/api/items?filter=value", HttpMethod.Get);

            // When
            var ex = Record.Exception(() => requestBuilder.ContainingQueryParam("sort", "name"));

            // Then
            Assert.IsType <InvalidOperationException>(ex);
            Assert.Contains("Url has already been configured to match with a QueryString", ex.Message);
        }
コード例 #6
0
        public void ForRequestDoesNotThrowOnDifferentUrlAndMethod(string firstUrl, HttpMethod firstMethod,
                                                                  string secondUrl, HttpMethod secondMethod)
        {
            // Given
            var builder = new TeePeeBuilder();

            builder.ForRequest(firstUrl, firstMethod);

            // When
            var ex = Record.Exception(() => builder.ForRequest(secondUrl, secondMethod));

            Assert.Null(ex);
        }
コード例 #7
0
        public void ForRequestThrowsOnDuplicateUrlAndMethod(string url, HttpMethod method)
        {
            // Given
            var builder = new TeePeeBuilder();

            builder.ForRequest(url, method);

            // When
            var ex = Record.Exception(() => builder.ForRequest(url, method));

            Assert.IsType <ArgumentException>(ex);
            Assert.Contains("already a request match for", ex.Message);
        }
コード例 #8
0
        public async Task ThrowsIfNoMatchInStrictMode()
        {
            // Given
            m_TrackingBuilder = new TeePeeBuilder(mode: TeePeeMode.Strict);

            // When
            var ex = await Record.ExceptionAsync(async() => await SendRequest());

            // Then
            Assert.NotNull(ex);
            var nex = Assert.IsType <NotSupportedException>(ex);

            Assert.Contains("request was made which did not match any of the TeePee rules.", nex.Message);
        }
コード例 #9
0
        public void WithBodyThrowsIfCalledMoreThanOnce()
        {
            // Given
            var builder        = new TeePeeBuilder();
            var requestBuilder = builder.ForRequest("https://site.net/api/items", HttpMethod.Get)
                                 .WithBody("test");

            // When
            var ex = Record.Exception(() => requestBuilder.WithBody("test"));

            // Then
            Assert.IsType <InvalidOperationException>(ex);
            Assert.Contains("matching Body has already been added", ex.Message);
        }
コード例 #10
0
        public void ContainingHeaderThrowsIfDupeName()
        {
            // Given
            var builder        = new TeePeeBuilder();
            var requestBuilder = builder.ForRequest("https://site.net/api/other", HttpMethod.Get)
                                 .ContainingHeader("Authorization", "Bearer x");

            // When
            var ex = Record.Exception(() => requestBuilder.ContainingHeader("Authorization", "Bearer y"));

            // Then
            Assert.IsType <ArgumentException>(ex);
            Assert.Contains("already been added", ex.Message);
        }
コード例 #11
0
        public void ContainingQueryParamThrowsIfAnotherMatchForUrlWithQueryStringAlreadyExists()
        {
            // Given
            var builder = new TeePeeBuilder();

            builder.ForRequest("https://site.net/api/items?filter=value", HttpMethod.Get);
            var requestBuilder = builder.ForRequest("https://site.net/api/other", HttpMethod.Get);

            // When
            var ex = Record.Exception(() => requestBuilder.ContainingQueryParam("sort", "name"));

            // Then
            Assert.IsType <InvalidOperationException>(ex);
            Assert.Contains("request matches already exist with QueryString matching", ex.Message);
        }
コード例 #12
0
        public async Task RespondsWithCorrectBodyWithCustomJsonSerializerOptions()
        {
            // Given
            var jsonSerializeOptions = new JsonSerializerOptions {
                IgnoreNullValues = true, PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            };

            m_TrackingBuilder = new TeePeeBuilder(bodySerializeOptions: jsonSerializeOptions);
            var bodyObject = new { Nullable = (string)null, Case = "value", EnumVal = ToTestJsonSettings.Off };

            RequestMatchBuilder().Responds()
            .WithBody(bodyObject);

            // When
            var response = await SendRequest();

            // Then
            Assert.NotNull(response);
            var responseBody = await response.Content.ReadAsStringAsync();

            Assert.Equal("{\"case\":\"value\",\"enumVal\":3}", responseBody);
        }
コード例 #13
0
        public static T WithTypedClient <T, TClient>(TeePeeBuilder teePeeBuilder, Action <IServiceCollection> configureServices = null) where T : class where TClient : class
        {
            var serviceCollection = new ServiceCollection();

            var teePeeMessageHandler = teePeeBuilder.Build().HttpHandler;

            if (configureServices != null)
            {
                // Use your own Typed Client setup here
                configureServices(serviceCollection);
                serviceCollection.AddTrackingForTypedClient <TClient>(teePeeMessageHandler);
            }
            else
            {
                // Otherwise, register the Typed Client here
                serviceCollection.AddHttpClient <TClient>(_ => { })
                .AddHttpMessageHandler(_ => teePeeMessageHandler);
            }

            serviceCollection.AddTransient <T>();

            return(serviceCollection.BuildServiceProvider().GetService <T>());
        }