public void Factory_CreateClient_WithName_UsesNamedOptions()
        {
            // Arrange
            var count = 0;

            Options.Get("github").HttpClientActions.Add(b =>
            {
                count++;
            });

            var factory = new DefaultHttpClientFactory(Services, Options, EmptyFilters);

            // Act
            var client = factory.CreateClient("github");

            // Assert
            Assert.Equal(1, count);
        }
        public void Factory_CreateClient_WithoutName_UsesDefaultOptions()
        {
            // Arrange
            var count = 0;

            Options.CurrentValue.HttpClientActions.Add(b =>
            {
                count++;
            });

            var factory = new DefaultHttpClientFactory(Services, Options, EmptyFilters);

            // Act
            var client = factory.CreateClient();

            // Assert
            Assert.Equal(1, count);
        }
        public void Factory_MultipleCalls_CachesHandler()
        {
            // Arrange
            var count = 0;

            Options.CurrentValue.HttpMessageHandlerBuilderActions.Add(b =>
            {
                count++;
            });

            var factory = new DefaultHttpClientFactory(Services, Options, EmptyFilters);

            // Act 1
            var client1 = factory.CreateClient();

            // Act 2
            var client2 = factory.CreateClient();

            // Assert
            Assert.Equal(1, count);
            Assert.NotSame(client1, client2);
        }
        public void Factory_MultipleCalls_DoesNotCacheHttpClient()
        {
            // Arrange
            var count = 0;

            Options.CurrentValue.HttpClientActions.Add(c =>
            {
                count++;
            });

            var factory = new DefaultHttpClientFactory(Services, Options, EmptyFilters);

            // Act 1
            var client1 = factory.CreateClient();

            // Act 2
            var client2 = factory.CreateClient();

            // Assert
            Assert.Equal(2, count);
            Assert.NotSame(client1, client2);
        }
        public void Factory_DisposeClient_DoesNotDisposeHandler()
        {
            // Arrange
            Options.CurrentValue.HttpMessageHandlerBuilderActions.Add(b =>
            {
                var mockHandler = new Mock <HttpMessageHandler>();
                mockHandler
                .Protected()
                .Setup("Dispose", true)
                .Throws(new Exception("Dispose should not be called"));

                b.PrimaryHandler = mockHandler.Object;
            });

            var factory = new DefaultHttpClientFactory(Services, Options, EmptyFilters);

            // Act
            using (factory.CreateClient())
            {
            }

            // Assert (does not throw)
        }
        public void Factory_CreateClient_FiltersCanDecorateBuilder()
        {
            // Arrange
            var expected = new HttpMessageHandler[]
            {
                Mock.Of <DelegatingHandler>(),  // Added by filter1
                Mock.Of <DelegatingHandler>(),  // Added by filter2
                Mock.Of <DelegatingHandler>(),  // Added by filter3
                Mock.Of <DelegatingHandler>(),  // Added in options
                Mock.Of <DelegatingHandler>(),  // Added by filter3
                Mock.Of <DelegatingHandler>(),  // Added by filter2
                Mock.Of <DelegatingHandler>(),  // Added by filter1

                Mock.Of <HttpMessageHandler>(), // Set as primary handler by options
            };

            Options.Get("github").HttpMessageHandlerBuilderActions.Add(b =>
            {
                b.PrimaryHandler = expected[7];

                b.AdditionalHandlers.Add((DelegatingHandler)expected[3]);
            });

            var filter1 = new Mock <IHttpMessageHandlerBuilderFilter>();

            filter1
            .Setup(f => f.Configure(It.IsAny <Action <HttpMessageHandlerBuilder> >()))
            .Returns <Action <HttpMessageHandlerBuilder> >(next => (b) =>
            {
                next(b);     // Calls filter2
                b.AdditionalHandlers.Insert(0, (DelegatingHandler)expected[0]);
                b.AdditionalHandlers.Add((DelegatingHandler)expected[6]);
            });

            var filter2 = new Mock <IHttpMessageHandlerBuilderFilter>();

            filter2
            .Setup(f => f.Configure(It.IsAny <Action <HttpMessageHandlerBuilder> >()))
            .Returns <Action <HttpMessageHandlerBuilder> >(next => (b) =>
            {
                next(b);     // Calls filter3
                b.AdditionalHandlers.Insert(0, (DelegatingHandler)expected[1]);
                b.AdditionalHandlers.Add((DelegatingHandler)expected[5]);
            });

            var filter3 = new Mock <IHttpMessageHandlerBuilderFilter>();

            filter3
            .Setup(f => f.Configure(It.IsAny <Action <HttpMessageHandlerBuilder> >()))
            .Returns <Action <HttpMessageHandlerBuilder> >(next => (b) =>
            {
                b.AdditionalHandlers.Add((DelegatingHandler)expected[2]);
                next(b);     // Calls options
                b.AdditionalHandlers.Add((DelegatingHandler)expected[4]);
            });

            var factory = new DefaultHttpClientFactory(Services, Options, new[] { filter1.Object, filter2.Object, filter3.Object, });

            // Act
            var handler = factory.CreateHandler("github");

            // Assert
            for (var i = 0; i < expected.Length - 1; i++)
            {
                Assert.Same(expected[i], handler);
                handler = Assert.IsAssignableFrom <DelegatingHandler>(handler).InnerHandler;
            }

            Assert.Same(expected[7], handler);
        }