Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public FileConfigurationPollerTests()
_fileConfig = new FileConfiguration();
_config = new Mock<IFileConfigurationPollerOptions>();
_repo.Setup(x => x.Get()).ReturnsAsync(new OkResponse<FileConfiguration>(_fileConfig));
_config.Setup(x => x.Delay).Returns(100);
_config.Setup(x => x.Delay).Returns(100);
_internalConfig = new Mock<IInternalConfiguration>();
_internalConfigRepo = new Mock<IInternalConfigurationRepository>();
_internalConfigCreator = new Mock<IInternalConfigurationCreator>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Newtonsoft.Json;
using Ocelot.Configuration.File;
using Ocelot.DependencyInjection;
using System.Runtime.CompilerServices;

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using Ocelot.Configuration.File;
using Ocelot.DependencyInjection;
using System.Runtime.CompilerServices;

namespace Ocelot.UnitTests.DependencyInjection;

public sealed class ConfigurationBuilderExtensionsTests : FileUnitTest
Expand All @@ -18,59 +17,59 @@ public sealed class ConfigurationBuilderExtensionsTests : FileUnitTest
private FileConfiguration _aggregate;
private FileConfiguration _envSpecific;
private FileConfiguration _combinedFileConfiguration;
private readonly Mock<IWebHostEnvironment> _hostingEnvironment;
private readonly Mock<IWebHostEnvironment> _hostingEnvironment;

public ConfigurationBuilderExtensionsTests()
{
_hostingEnvironment = new Mock<IWebHostEnvironment>();
}

protected override string EnvironmentName()
_hostingEnvironment = new Mock<IWebHostEnvironment>();
}
protected override string EnvironmentName()
=> _hostingEnvironment?.Object?.EnvironmentName ?? base.EnvironmentName();

[Fact]
public void Should_add_base_url_to_config()
{
{
// Arrange
_configuration = new ConfigurationBuilder()
.AddOcelotBaseUrl("test")
.Build();
.AddOcelotBaseUrl("test")
.Build();

// Act
// Act
var actual = _configuration.GetValue("BaseUrl", string.Empty);

// Assert
// Assert
actual.ShouldBe("test");
}

[Fact]
[Trait("PR", "1227")]
[Trait("Issue", "1216")]
[Fact]
[Trait("PR", "1227")]
[Trait("Issue", "1216")]
public void Should_merge_files_to_file()
{
{
// Arrange
GivenTheEnvironmentIs(TestID);
GivenMultipleConfigurationFiles(TestID);

// Act
WhenIAddOcelotConfiguration(TestID);

// Assert
ThenTheConfigsAreMergedAndAddedInApplicationConfiguration(false);
GivenTheEnvironmentIs(TestID);
GivenMultipleConfigurationFiles(TestID);
// Act
WhenIAddOcelotConfiguration(TestID);
// Assert
ThenTheConfigsAreMergedAndAddedInApplicationConfiguration(false);
TheOcelotPrimaryConfigFileExists(true);
}

[Fact]
public void Should_store_given_configurations_when_provided_file_configuration_object()
{
{
// Arrange
GivenTheEnvironmentIs(TestID);
GivenCombinedFileConfigurationObject();

// Act
WhenIAddOcelotConfigurationWithCombinedFileConfiguration();

// Assert
GivenTheEnvironmentIs(TestID);
GivenCombinedFileConfigurationObject();
// Act
WhenIAddOcelotConfigurationWithCombinedFileConfiguration();
// Assert
ThenTheConfigsAreMergedAndAddedInApplicationConfiguration(true);
}

Expand All @@ -80,11 +79,11 @@ public void Should_merge_files_except_env()
// Arrange
GivenTheEnvironmentIs(TestID);
GivenMultipleConfigurationFiles(TestID, true);

// Act
// Act
WhenIAddOcelotConfiguration(TestID);

// Assert
// Assert
ThenTheConfigsAreMergedAndAddedInApplicationConfiguration(false);
NotContainsEnvSpecificConfig();
}
Expand All @@ -93,49 +92,49 @@ public void Should_merge_files_except_env()
public void Should_merge_files_in_specific_folder()
{
// Arrange
GivenMultipleConfigurationFiles(TestID);

// Act
WhenIAddOcelotConfiguration(TestID);

// Assert
GivenMultipleConfigurationFiles(TestID);
// Act
WhenIAddOcelotConfiguration(TestID);
// Assert
ThenTheConfigsAreMergedAndAddedInApplicationConfiguration(false);
}

[Fact]
[Trait("PR", "1227")]
[Trait("Issue", "1216")]
[Fact]
[Trait("PR", "1227")]
[Trait("Issue", "1216")]
public void Should_merge_files_to_memory()
{
{
// Arrange
GivenTheEnvironmentIs(TestID);
GivenTheEnvironmentIs(TestID);
GivenMultipleConfigurationFiles(TestID);

// Act
WhenIAddOcelotConfiguration(TestID, MergeOcelotJson.ToMemory);

// Assert
ThenTheConfigsAreMergedAndAddedInApplicationConfiguration(false);
// Act
WhenIAddOcelotConfiguration(TestID, MergeOcelotJson.ToMemory);
// Assert
ThenTheConfigsAreMergedAndAddedInApplicationConfiguration(false);
TheOcelotPrimaryConfigFileExists(false);
}

[Fact]
[Trait("PR", "1986")]
[Trait("Issue", "1518")]
[Fact]
[Trait("PR", "1986")]
[Trait("Issue", "1518")]
public void Should_merge_files_with_null_environment()
{
{
// Arrange
environmentConfigFileName = null; // Ups!
const IWebHostEnvironment NullEnvironment = null; // Wow!
environmentConfigFileName = null; // Ups!
const IWebHostEnvironment NullEnvironment = null; // Wow!
GivenMultipleConfigurationFiles(TestID, false);

// Act
_configRoot = new ConfigurationBuilder()
.AddOcelot(TestID, NullEnvironment, MergeOcelotJson.ToMemory, primaryConfigFileName, globalConfigFileName, environmentConfigFileName, false, false)
// Act
_configRoot = new ConfigurationBuilder()
.AddOcelot(TestID, NullEnvironment, MergeOcelotJson.ToMemory, primaryConfigFileName, globalConfigFileName, environmentConfigFileName, false, false)
.Build();

// Assert
ThenTheConfigsAreMergedAndAddedInApplicationConfiguration(false);
// Assert
ThenTheConfigsAreMergedAndAddedInApplicationConfiguration(false);
TheOcelotPrimaryConfigFileExists(false);
}

Expand All @@ -158,105 +157,105 @@ private void GivenCombinedFileConfigurationObject([CallerMemberName] string test
{
_combinedFileConfiguration = new FileConfiguration
{
GlobalConfiguration = GetFileGlobalConfigurationData(testName),
Routes = GetServiceARoutes().Concat(GetServiceBRoutes()).Concat(GetEnvironmentSpecificRoutes()).ToList(),
GlobalConfiguration = GetFileGlobalConfigurationData(testName),
Routes = GetServiceARoutes().Concat(GetServiceBRoutes()).Concat(GetEnvironmentSpecificRoutes()).ToList(),
Aggregates = GetFileAggregatesRouteData(),
};
}
}

private void GivenMultipleConfigurationFiles(string folder, bool withEnvironment = false, [CallerMemberName] string testName = null)
{
_globalConfig = new() { GlobalConfiguration = GetFileGlobalConfigurationData(testName) };
_routeA = new() { Routes = GetServiceARoutes() };
_routeB = new() { Routes = GetServiceBRoutes() };
_aggregate = new() { Aggregates = GetFileAggregatesRouteData() };
_envSpecific = new() { Routes = GetEnvironmentSpecificRoutes() };

var configParts = new Dictionary<string, FileConfiguration>
{
_envSpecific = new() { Routes = GetEnvironmentSpecificRoutes() };
var configParts = new Dictionary<string, FileConfiguration>
{
{ "global", _globalConfig },
{ "routesA", _routeA },
{ "routesB", _routeB },
{ "aggregates", _aggregate },
{ "aggregates", _aggregate },
};

if (withEnvironment)
{
{
configParts.Add(EnvironmentName(), _envSpecific);
}

foreach (var part in configParts)
{
var filename = Path.Combine(folder, string.Format(ConfigurationBuilderExtensions.EnvironmentConfigFile, part.Key));
File.WriteAllText(filename, JsonConvert.SerializeObject(part.Value, Formatting.Indented));
files.Add(filename);
}
}

private static FileGlobalConfiguration GetFileGlobalConfigurationData(string requestIdKey = null) => new()
{
BaseUrl = "BaseUrl",
RateLimitOptions = new()
{
HttpStatusCode = 500,
ClientIdHeader = "ClientIdHeader",
QuotaExceededMessage = "QuotaExceededMessage",
RateLimitCounterPrefix = "RateLimitCounterPrefix",
},
ServiceDiscoveryProvider = new()
{
Scheme = "https",
Host = "Host",
Port = 80,
Type = "Type",
},
RequestIdKey = requestIdKey ?? "RequestIdKey",
};

private static List<FileAggregateRoute> GetFileAggregatesRouteData() => new()
foreach (var part in configParts)
{
var filename = Path.Combine(folder, string.Format(ConfigurationBuilderExtensions.EnvironmentConfigFile, part.Key));
File.WriteAllText(filename, JsonConvert.SerializeObject(part.Value, Formatting.Indented));
files.Add(filename);
}
}
private static FileGlobalConfiguration GetFileGlobalConfigurationData(string requestIdKey = null) => new()
{
BaseUrl = "BaseUrl",
RateLimitOptions = new()
{
HttpStatusCode = 500,
ClientIdHeader = "ClientIdHeader",
QuotaExceededMessage = "QuotaExceededMessage",
RateLimitCounterPrefix = "RateLimitCounterPrefix",
},
ServiceDiscoveryProvider = new()
{
Scheme = "https",
Host = "Host",
Port = 80,
Type = "Type",
},
RequestIdKey = requestIdKey ?? "RequestIdKey",
};
private static List<FileAggregateRoute> GetFileAggregatesRouteData() => new()
{
new()
{
RouteKeys = ["KeyB", "KeyBB"],
UpstreamPathTemplate = "UpstreamPathTemplate",
},
};

private static FileRoute GetRoute(string suffix) => new()
{
DownstreamScheme = "DownstreamScheme" + suffix,
DownstreamPathTemplate = "DownstreamPathTemplate" + suffix,
Key = "Key" + suffix,
UpstreamHost = "UpstreamHost" + suffix,
UpstreamHttpMethod = [ "UpstreamHttpMethod" + suffix ],
DownstreamHostAndPorts = new()
{
};
private static FileRoute GetRoute(string suffix) => new()
{
DownstreamScheme = "DownstreamScheme" + suffix,
DownstreamPathTemplate = "DownstreamPathTemplate" + suffix,
Key = "Key" + suffix,
UpstreamHost = "UpstreamHost" + suffix,
UpstreamHttpMethod = [ "UpstreamHttpMethod" + suffix ],
DownstreamHostAndPorts = new()
{
new("Host"+suffix, 80),
},
},
};

private static List<FileRoute> GetServiceARoutes() => new() { GetRoute("A") };
private static List<FileRoute> GetServiceBRoutes() => new() { GetRoute("B"), GetRoute("BB") };
private static List<FileRoute> GetServiceARoutes() => new() { GetRoute("A") };
private static List<FileRoute> GetServiceBRoutes() => new() { GetRoute("B"), GetRoute("BB") };
private static List<FileRoute> GetEnvironmentSpecificRoutes() => new() { GetRoute("Spec") };

private void GivenTheEnvironmentIs(string folder, [CallerMemberName] string testName = null)
{
{
_hostingEnvironment.SetupGet(x => x.EnvironmentName).Returns(testName);
environmentConfigFileName = Path.Combine(folder, string.Format(ConfigurationBuilderExtensions.EnvironmentConfigFile, testName));
files.Add(environmentConfigFileName);
files.Add(environmentConfigFileName);
}

private void WhenIAddOcelotConfigurationWithCombinedFileConfiguration()
{
_configRoot = new ConfigurationBuilder()
.AddOcelot(_combinedFileConfiguration, primaryConfigFileName, false, false)
_configRoot = new ConfigurationBuilder()
.AddOcelot(_combinedFileConfiguration, primaryConfigFileName, false, false)
.Build();
}

private void WhenIAddOcelotConfiguration(string folder, MergeOcelotJson mergeOcelotJson = MergeOcelotJson.ToFile)
{
_configRoot = new ConfigurationBuilder()
.AddOcelot(folder, _hostingEnvironment.Object, mergeOcelotJson, primaryConfigFileName, globalConfigFileName, environmentConfigFileName, false, false)
_configRoot = new ConfigurationBuilder()
.AddOcelot(folder, _hostingEnvironment.Object, mergeOcelotJson, primaryConfigFileName, globalConfigFileName, environmentConfigFileName, false, false)
.Build();
}

Expand All @@ -270,7 +269,7 @@ private void WhenIAddOcelotConfigurationWithDefaultFilePaths(string folder, Merg
private FileConfiguration ThenTheConfigsAreMergedAndAddedInApplicationConfiguration(bool useCombinedConfig)
{
var fc = _configRoot.Get<FileConfiguration>();

fc.GlobalConfiguration.BaseUrl.ShouldBe(useCombinedConfig ? _combinedFileConfiguration.GlobalConfiguration.BaseUrl : _globalConfig.GlobalConfiguration.BaseUrl);
fc.GlobalConfiguration.RateLimitOptions.ClientIdHeader.ShouldBe(useCombinedConfig ? _combinedFileConfiguration.GlobalConfiguration.RateLimitOptions.ClientIdHeader : _globalConfig.GlobalConfiguration.RateLimitOptions.ClientIdHeader);
fc.GlobalConfiguration.RateLimitOptions.DisableRateLimitHeaders.ShouldBe(useCombinedConfig ? _combinedFileConfiguration.GlobalConfiguration.RateLimitOptions.DisableRateLimitHeaders : _globalConfig.GlobalConfiguration.RateLimitOptions.DisableRateLimitHeaders);
Expand Down
Loading
Loading