mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 15:50:49 +08:00 
			
		
		
		
	Feature/re route specific handlers (#269)
* #264 added handlers to config * #264 added global handlers object and defaut param for method, not sure this is correct api for users yet * #264 Can now add all sorts of delegating handlers in all sorts of ways * +semver: breaking #264
This commit is contained in:
		@@ -28,26 +28,58 @@ namespace Ocelot.UnitTests.DependencyInjection
 | 
			
		||||
        private readonly IConfiguration _configRoot;
 | 
			
		||||
        private IOcelotBuilder _ocelotBuilder;
 | 
			
		||||
        private readonly int _maxRetries;
 | 
			
		||||
        private Exception _ex;
 | 
			
		||||
 | 
			
		||||
        public OcelotBuilderTests()
 | 
			
		||||
        {
 | 
			
		||||
            _configRoot = new ConfigurationRoot(new List<IConfigurationProvider>());
 | 
			
		||||
            _services = new ServiceCollection();
 | 
			
		||||
            _services.AddSingleton<IHostingEnvironment, HostingEnvironment>();
 | 
			
		||||
            _services.AddSingleton<IConfiguration>(_configRoot);
 | 
			
		||||
            _services.AddSingleton(_configRoot);
 | 
			
		||||
            _maxRetries = 100;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private Exception _ex;
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_add_specific_delegating_handlers_transient()
 | 
			
		||||
        {
 | 
			
		||||
            this.Given(x => WhenISetUpOcelotServices())
 | 
			
		||||
                .When(x => AddSpecificTransientDelegatingHandler<FakeDelegatingHandler>())
 | 
			
		||||
                .And(x => AddSpecificTransientDelegatingHandler<FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .Then(x => ThenTheProviderIsRegisteredAndReturnsSpecificHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .And(x => ThenTheSpecificHandlersAreTransient())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_add_delegating_handlers_with_di()
 | 
			
		||||
        public void should_add_specific_delegating_handler_singleton()
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            this.Given(x => WhenISetUpOcelotServices())
 | 
			
		||||
                .When(x => AddDelegate<FakeDelegatingHandler>())
 | 
			
		||||
                .And(x => AddDelegate<FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .When(x => AddSpecificDelegatingHandler<FakeDelegatingHandler>())
 | 
			
		||||
                .And(x => AddSpecificDelegatingHandler<FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .Then(x => ThenTheProviderIsRegisteredAndReturnsSpecificHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .And(x => ThenTheSpecificHandlersAreSingleton())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_add_global_delegating_handlers_transient()
 | 
			
		||||
        {
 | 
			
		||||
            this.Given(x => WhenISetUpOcelotServices())
 | 
			
		||||
                .When(x => AddTransientGlobalDelegatingHandler<FakeDelegatingHandler>())
 | 
			
		||||
                .And(x => AddTransientGlobalDelegatingHandler<FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .Then(x => ThenTheProviderIsRegisteredAndReturnsHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .And(x => ThenTheGlobalHandlersAreTransient())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_add_global_delegating_handlers_singleton()
 | 
			
		||||
        {
 | 
			
		||||
            this.Given(x => WhenISetUpOcelotServices())
 | 
			
		||||
                .When(x => AddGlobalDelegatingHandler<FakeDelegatingHandler>())
 | 
			
		||||
                .And(x => AddGlobalDelegatingHandler<FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .Then(x => ThenTheProviderIsRegisteredAndReturnsHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
			
		||||
                .And(x => ThenTheGlobalHandlersAreSingleton())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -118,16 +150,6 @@ namespace Ocelot.UnitTests.DependencyInjection
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenISetUpAdministration()
 | 
			
		||||
        {
 | 
			
		||||
            _ocelotBuilder.AddAdministration("/administration", "secret");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenISetUpAdministration(Action<IdentityServerAuthenticationOptions> options)
 | 
			
		||||
        {
 | 
			
		||||
            _ocelotBuilder.AddAdministration("/administration", options);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_use_logger_factory()
 | 
			
		||||
        {
 | 
			
		||||
@@ -155,6 +177,62 @@ namespace Ocelot.UnitTests.DependencyInjection
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheSpecificHandlersAreSingleton()
 | 
			
		||||
        {
 | 
			
		||||
            var handlers = _serviceProvider.GetServices<DelegatingHandler>().ToList();
 | 
			
		||||
            var first = handlers[0];
 | 
			
		||||
            handlers = _serviceProvider.GetServices<DelegatingHandler>().ToList();
 | 
			
		||||
            var second = handlers[0];
 | 
			
		||||
            first.ShouldBe(second);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheSpecificHandlersAreTransient()
 | 
			
		||||
        {
 | 
			
		||||
            var handlers = _serviceProvider.GetServices<DelegatingHandler>().ToList();
 | 
			
		||||
            var first = handlers[0];
 | 
			
		||||
            handlers = _serviceProvider.GetServices<DelegatingHandler>().ToList();
 | 
			
		||||
            var second = handlers[0];
 | 
			
		||||
            first.ShouldNotBe(second);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheGlobalHandlersAreSingleton()
 | 
			
		||||
        {
 | 
			
		||||
            var handlers = _serviceProvider.GetServices<GlobalDelegatingHandler>().ToList();
 | 
			
		||||
            var first = handlers[0].DelegatingHandler;
 | 
			
		||||
            handlers = _serviceProvider.GetServices<GlobalDelegatingHandler>().ToList();
 | 
			
		||||
            var second = handlers[0].DelegatingHandler;
 | 
			
		||||
            first.ShouldBe(second);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheGlobalHandlersAreTransient()
 | 
			
		||||
        {
 | 
			
		||||
            var handlers = _serviceProvider.GetServices<GlobalDelegatingHandler>().ToList();
 | 
			
		||||
            var first = handlers[0].DelegatingHandler;
 | 
			
		||||
            handlers = _serviceProvider.GetServices<GlobalDelegatingHandler>().ToList();
 | 
			
		||||
            var second = handlers[0].DelegatingHandler;
 | 
			
		||||
            first.ShouldNotBe(second);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenISetUpAdministration()
 | 
			
		||||
        {
 | 
			
		||||
            _ocelotBuilder.AddAdministration("/administration", "secret");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenISetUpAdministration(Action<IdentityServerAuthenticationOptions> options)
 | 
			
		||||
        {
 | 
			
		||||
            _ocelotBuilder.AddAdministration("/administration", options);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void AddTransientGlobalDelegatingHandler<T>() where T : DelegatingHandler
 | 
			
		||||
        {
 | 
			
		||||
            _ocelotBuilder.AddTransientDelegatingHandler<T>(true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void AddSpecificTransientDelegatingHandler<T>() where T : DelegatingHandler
 | 
			
		||||
        {
 | 
			
		||||
            _ocelotBuilder.AddTransientDelegatingHandler<T>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheCorrectAdminPathIsRegitered()
 | 
			
		||||
        {
 | 
			
		||||
            _serviceProvider = _services.BuildServiceProvider();
 | 
			
		||||
@@ -163,6 +241,14 @@ namespace Ocelot.UnitTests.DependencyInjection
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheProviderIsRegisteredAndReturnsHandlers<TOne, TWo>()
 | 
			
		||||
        {
 | 
			
		||||
            _serviceProvider = _services.BuildServiceProvider();
 | 
			
		||||
            var handlers = _serviceProvider.GetServices<GlobalDelegatingHandler>().ToList();
 | 
			
		||||
            handlers[0].DelegatingHandler.ShouldBeOfType<TOne>();
 | 
			
		||||
            handlers[1].DelegatingHandler.ShouldBeOfType<TWo>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheProviderIsRegisteredAndReturnsSpecificHandlers<TOne, TWo>()
 | 
			
		||||
        {
 | 
			
		||||
            _serviceProvider = _services.BuildServiceProvider();
 | 
			
		||||
            var handlers = _serviceProvider.GetServices<DelegatingHandler>().ToList();
 | 
			
		||||
@@ -174,14 +260,18 @@ namespace Ocelot.UnitTests.DependencyInjection
 | 
			
		||||
        {
 | 
			
		||||
            var outputCache = _services.Single(x => x.ServiceType == typeof(IOcelotCache<CachedResponse>));
 | 
			
		||||
            var outputCacheManager = _services.Single(x => x.ServiceType == typeof(ICacheManager<CachedResponse>));
 | 
			
		||||
            var thing = (CacheManager.Core.ICacheManager<CachedResponse>)outputCacheManager.ImplementationInstance;
 | 
			
		||||
            thing.Configuration.MaxRetries.ShouldBe(_maxRetries);
 | 
			
		||||
            
 | 
			
		||||
            var instance = (ICacheManager<CachedResponse>)outputCacheManager.ImplementationInstance;
 | 
			
		||||
            var ocelotConfigCache = _services.Single(x => x.ServiceType == typeof(IOcelotCache<IOcelotConfiguration>));
 | 
			
		||||
            var ocelotConfigCacheManager = _services.Single(x => x.ServiceType == typeof(ICacheManager<IOcelotConfiguration>));
 | 
			
		||||
 | 
			
		||||
            var fileConfigCache = _services.Single(x => x.ServiceType == typeof(IOcelotCache<FileConfiguration>));
 | 
			
		||||
            var fileConfigCacheManager = _services.Single(x => x.ServiceType == typeof(ICacheManager<FileConfiguration>));
 | 
			
		||||
 | 
			
		||||
            instance.Configuration.MaxRetries.ShouldBe(_maxRetries);
 | 
			
		||||
            outputCache.ShouldNotBeNull();
 | 
			
		||||
            ocelotConfigCache.ShouldNotBeNull();
 | 
			
		||||
            ocelotConfigCacheManager.ShouldNotBeNull();
 | 
			
		||||
            fileConfigCache.ShouldNotBeNull();
 | 
			
		||||
            fileConfigCacheManager.ShouldNotBeNull();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenISetUpConsul()
 | 
			
		||||
@@ -208,9 +298,14 @@ namespace Ocelot.UnitTests.DependencyInjection
 | 
			
		||||
            }       
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void AddDelegate<T>() where T : DelegatingHandler
 | 
			
		||||
        private void AddGlobalDelegatingHandler<T>() where T : DelegatingHandler
 | 
			
		||||
        {
 | 
			
		||||
            _ocelotBuilder.AddDelegatingHandler<T>();
 | 
			
		||||
            _ocelotBuilder.AddSingletonDelegatingHandler<T>(true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void AddSpecificDelegatingHandler<T>() where T : DelegatingHandler
 | 
			
		||||
        {
 | 
			
		||||
            _ocelotBuilder.AddSingletonDelegatingHandler<T>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenAnOcelotBuilderIsReturned()
 | 
			
		||||
@@ -281,6 +376,7 @@ namespace Ocelot.UnitTests.DependencyInjection
 | 
			
		||||
            {
 | 
			
		||||
                _serviceProvider = _services.BuildServiceProvider();
 | 
			
		||||
                var logger = _serviceProvider.GetService<IFileConfigurationSetter>();
 | 
			
		||||
                logger.ShouldNotBeNull();
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
            {
 | 
			
		||||
@@ -293,6 +389,7 @@ namespace Ocelot.UnitTests.DependencyInjection
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var tracingHandler = _serviceProvider.GetService<OcelotHttpTracingHandler>();
 | 
			
		||||
                tracingHandler.ShouldNotBeNull();
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user