From bac71164aa2c1e0ab0f43ef4bf552d2d2f04bb74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mark=20B=C3=B8g=20L=C3=B8nquist?= Date: Fri, 26 May 2023 21:46:47 +0200 Subject: [PATCH 1/7] adds global header transforms --- .../Creator/HeaderFindAndReplaceCreator.cs | 69 ++++++++++++++++++- .../File/FileGlobalConfiguration.cs | 5 ++ .../HeaderFindAndReplaceCreatorTests.cs | 48 +++++++++++-- 3 files changed, 112 insertions(+), 10 deletions(-) diff --git a/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs b/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs index 07c558fb0..d221582d6 100644 --- a/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs +++ b/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs @@ -1,18 +1,23 @@ +using System; +using System.Collections.Generic; +using Microsoft.Extensions.Options; using Ocelot.Configuration.File; using Ocelot.Infrastructure; using Ocelot.Logging; -using Ocelot.Responses; +using Ocelot.Responses; namespace Ocelot.Configuration.Creator { public class HeaderFindAndReplaceCreator : IHeaderFindAndReplaceCreator { + private readonly FileGlobalConfiguration _fileGlobalConfiguration; private readonly IPlaceholders _placeholders; private readonly IOcelotLogger _logger; - public HeaderFindAndReplaceCreator(IPlaceholders placeholders, IOcelotLoggerFactory factory) + public HeaderFindAndReplaceCreator(IOptions fileConfiguration, IPlaceholders placeholders, IOcelotLoggerFactory factory) { _logger = factory.CreateLogger(); + _fileGlobalConfiguration = fileConfiguration.Value.GlobalConfiguration; _placeholders = placeholders; } @@ -20,6 +25,7 @@ public HeaderTransformations Create(FileRoute fileRoute) { var upstream = new List(); var addHeadersToUpstream = new List(); + var upstreamAdded = new HashSet(); foreach (var input in fileRoute.UpstreamHeaderTransform) { @@ -29,6 +35,34 @@ public HeaderTransformations Create(FileRoute fileRoute) if (!hAndr.IsError) { upstream.Add(hAndr.Data); + upstreamAdded.Add(input.Key); + } + else + { + _logger.LogWarning($"Unable to add UpstreamHeaderTransform {input.Key}: {input.Value}"); + } + } + else + { + addHeadersToUpstream.Add(new AddHeader(input.Key, input.Value)); + upstreamAdded.Add(input.Key); + } + } + + foreach (var input in _fileGlobalConfiguration.UpstreamHeaderTransform) + { + if (upstreamAdded.Contains(input.Key)) + { + continue; + } + + if (input.Value.Contains(",")) + { + var hAndr = Map(input); + if (!hAndr.IsError) + { + upstream.Add(hAndr.Data); + } else { @@ -38,14 +72,43 @@ public HeaderTransformations Create(FileRoute fileRoute) else { addHeadersToUpstream.Add(new AddHeader(input.Key, input.Value)); + } } var downstream = new List(); var addHeadersToDownstream = new List(); - + var downstreamAdded = new HashSet(); + foreach (var input in fileRoute.DownstreamHeaderTransform) { + if (input.Value.Contains(",")) + { + var hAndr = Map(input); + if (!hAndr.IsError) + { + downstream.Add(hAndr.Data); + downstreamAdded.Add(input.Key); + } + else + { + _logger.LogWarning($"Unable to add DownstreamHeaderTransform {input.Key}: {input.Value}"); + } + } + else + { + addHeadersToDownstream.Add(new AddHeader(input.Key, input.Value)); + downstreamAdded.Add(input.Key); + } + } + + foreach (var input in _fileGlobalConfiguration.DownstreamHeaderTransform) + { + if (downstreamAdded.Contains(input.Key)) + { + continue; + } + if (input.Value.Contains(",")) { var hAndr = Map(input); diff --git a/src/Ocelot/Configuration/File/FileGlobalConfiguration.cs b/src/Ocelot/Configuration/File/FileGlobalConfiguration.cs index 7ce35f99e..7021efa38 100644 --- a/src/Ocelot/Configuration/File/FileGlobalConfiguration.cs +++ b/src/Ocelot/Configuration/File/FileGlobalConfiguration.cs @@ -13,6 +13,8 @@ public FileGlobalConfiguration() HttpHandlerOptions = new FileHttpHandlerOptions(); CacheOptions = new FileCacheOptions(); MetadataOptions = new FileMetadataOptions(); + UpstreamHeaderTransform = new Dictionary(); + DownstreamHeaderTransform = new Dictionary(); } public string RequestIdKey { get; set; } @@ -48,5 +50,8 @@ public FileGlobalConfiguration() public FileCacheOptions CacheOptions { get; set; } public FileMetadataOptions MetadataOptions { get; set; } + + public Dictionary UpstreamHeaderTransform { get; set; } + public Dictionary DownstreamHeaderTransform { get; set; } } } diff --git a/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs b/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs index b5f42d6e3..2936b914f 100644 --- a/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs +++ b/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs @@ -1,3 +1,7 @@ +using System.Collections.Generic; +using Microsoft.Extensions.Options; +using Moq; + using Ocelot.Configuration; using Ocelot.Configuration.Creator; using Ocelot.Configuration.File; @@ -5,7 +9,7 @@ using Ocelot.Logging; using Ocelot.Responses; using Ocelot.UnitTests.Responder; - + namespace Ocelot.UnitTests.Configuration { public class HeaderFindAndReplaceCreatorTests : UnitTest @@ -23,7 +27,19 @@ public HeaderFindAndReplaceCreatorTests() _factory = new Mock(); _factory.Setup(x => x.CreateLogger()).Returns(_logger.Object); _placeholders = new Mock(); - _creator = new HeaderFindAndReplaceCreator(_placeholders.Object, _factory.Object); + var fileGlobalConfiguration = new FileGlobalConfiguration(); + fileGlobalConfiguration.UpstreamHeaderTransform.Add("TestGlobal", "Test, Chicken"); + fileGlobalConfiguration.UpstreamHeaderTransform.Add("MoopGlobal", "o, a"); + fileGlobalConfiguration.DownstreamHeaderTransform.Add("PopGlobal", "West, East"); + fileGlobalConfiguration.DownstreamHeaderTransform.Add("BopGlobal", "e, r"); + + var options = new Mock>(); + options.Setup(x => x.Value).Returns(new FileConfiguration + { + GlobalConfiguration = fileGlobalConfiguration, + }); + + _creator = new HeaderFindAndReplaceCreator(options.Object, _placeholders.Object, _factory.Object); } [Fact] @@ -47,12 +63,16 @@ public void should_create() { new("Test", "Test", "Chicken", 0), new("Moop", "o", "a", 0), + new("TestGlobal", "Test", "Chicken", 0), + new("MoopGlobal", "o", "a", 0), }; var downstream = new List { new("Pop", "West", "East", 0), new("Bop", "e", "r", 0), + new("PopGlobal", "West", "East", 0), + new("BopGlobal", "e", "r", 0), }; this.Given(x => GivenTheRoute(route)) @@ -98,6 +118,8 @@ public void should_use_base_url_placeholder() var downstream = new List { new("Location", "http://www.bbc.co.uk/", "http://ocelot.com/", 0), + new("PopGlobal", "West", "East", 0), + new("BopGlobal", "e", "r", 0), }; this.Given(x => GivenTheRoute(route)) @@ -122,13 +144,23 @@ public void should_log_errors_and_not_add_headers() }, }; - var expected = new List(); + var expectedDownstream = new List + { + new("PopGlobal", "West", "East", 0), + new("BopGlobal", "e", "r", 0), + }; + + var expectedUpstream = new List + { + new("TestGlobal", "Test", "Chicken", 0), + new("MoopGlobal", "o", "a", 0), + }; this.Given(x => GivenTheRoute(route)) .And(x => GivenTheBaseUrlErrors()) .When(x => WhenICreate()) - .Then(x => ThenTheFollowingDownstreamIsReturned(expected)) - .And(x => ThenTheFollowingUpstreamIsReturned(expected)) + .Then(x => ThenTheFollowingDownstreamIsReturned(expectedDownstream)) + .And(x => ThenTheFollowingUpstreamIsReturned(expectedUpstream)) .And(x => ThenTheLoggerIsCalledCorrectly("Unable to add DownstreamHeaderTransform Location: http://www.bbc.co.uk/, {BaseUrl}")) .And(x => ThenTheLoggerIsCalledCorrectly("Unable to add UpstreamHeaderTransform Location: http://www.bbc.co.uk/, {BaseUrl}")) .BDDfy(); @@ -139,7 +171,7 @@ private void ThenTheLoggerIsCalledCorrectly(string message) _logger.Verify(x => x.LogWarning(It.Is>(y => y.Invoke() == message)), Times.Once); } - [Fact] + [Fact] public void should_use_base_url_partial_placeholder() { var route = new FileRoute @@ -153,6 +185,8 @@ public void should_use_base_url_partial_placeholder() var downstream = new List { new("Location", "http://www.bbc.co.uk/pay", "http://ocelot.com/pay", 0), + new("PopGlobal", "West", "East", 0), + new("BopGlobal", "e", "r", 0), }; this.Given(x => GivenTheRoute(route)) @@ -162,7 +196,7 @@ public void should_use_base_url_partial_placeholder() .BDDfy(); } - [Fact] + [Fact] public void should_map_with_partial_placeholder_in_the_middle() { var route = new FileRoute From c541aa1f306925e02581fb0e3ffa0a6eb915f323 Mon Sep 17 00:00:00 2001 From: Raman Maksimchuk Date: Thu, 1 Jun 2023 21:10:40 +0300 Subject: [PATCH 2/7] Merge local and global settings --- .../Creator/HeaderFindAndReplaceCreator.cs | 82 ++++++------------- .../File/FileGlobalConfiguration.cs | 1 + 2 files changed, 25 insertions(+), 58 deletions(-) diff --git a/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs b/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs index d221582d6..743189fc3 100644 --- a/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs +++ b/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs @@ -1,10 +1,11 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.Extensions.Options; using Ocelot.Configuration.File; using Ocelot.Infrastructure; using Ocelot.Logging; -using Ocelot.Responses; +using Ocelot.Responses; namespace Ocelot.Configuration.Creator { @@ -27,9 +28,11 @@ public HeaderTransformations Create(FileRoute fileRoute) var addHeadersToUpstream = new List(); var upstreamAdded = new HashSet(); - foreach (var input in fileRoute.UpstreamHeaderTransform) + var upstreamHeaderTransform = Merge(fileRoute.UpstreamHeaderTransform, _fileGlobalConfiguration.UpstreamHeaderTransform); + + foreach (var input in upstreamHeaderTransform) { - if (input.Value.Contains(",")) + if (input.Value.Contains(',')) { var hAndr = Map(input); if (!hAndr.IsError) @@ -49,40 +52,15 @@ public HeaderTransformations Create(FileRoute fileRoute) } } - foreach (var input in _fileGlobalConfiguration.UpstreamHeaderTransform) - { - if (upstreamAdded.Contains(input.Key)) - { - continue; - } - - if (input.Value.Contains(",")) - { - var hAndr = Map(input); - if (!hAndr.IsError) - { - upstream.Add(hAndr.Data); - - } - else - { - _logger.LogWarning(() => $"Unable to add UpstreamHeaderTransform {input.Key}: {input.Value}"); - } - } - else - { - addHeadersToUpstream.Add(new AddHeader(input.Key, input.Value)); - - } - } - var downstream = new List(); var addHeadersToDownstream = new List(); var downstreamAdded = new HashSet(); - - foreach (var input in fileRoute.DownstreamHeaderTransform) + + var downstreamHeaderTransform = Merge(fileRoute.DownstreamHeaderTransform, _fileGlobalConfiguration.DownstreamHeaderTransform); + + foreach (var input in downstreamHeaderTransform) { - if (input.Value.Contains(",")) + if (input.Value.Contains(',')) { var hAndr = Map(input); if (!hAndr.IsError) @@ -102,31 +80,6 @@ public HeaderTransformations Create(FileRoute fileRoute) } } - foreach (var input in _fileGlobalConfiguration.DownstreamHeaderTransform) - { - if (downstreamAdded.Contains(input.Key)) - { - continue; - } - - if (input.Value.Contains(",")) - { - var hAndr = Map(input); - if (!hAndr.IsError) - { - downstream.Add(hAndr.Data); - } - else - { - _logger.LogWarning(() => $"Unable to add DownstreamHeaderTransform {input.Key}: {input.Value}"); - } - } - else - { - addHeadersToDownstream.Add(new AddHeader(input.Key, input.Value)); - } - } - return new HeaderTransformations(upstream, downstream, addHeadersToDownstream, addHeadersToUpstream); } @@ -157,5 +110,18 @@ private Response Map(KeyValuePair input) return new OkResponse(hAndr); } + + /// + /// Merge global Up/Downstream settings to the Route local ones. + /// + /// The Route local settings. + /// Global default settings. + /// An collection. + public static IEnumerable> Merge(Dictionary local, Dictionary global) + { + // Winning strategy: The Route local setting wins over global one + var toAdd = global.ExceptBy(local.Keys, x => x.Key); + return local.Union(toAdd).ToList(); + } } } diff --git a/src/Ocelot/Configuration/File/FileGlobalConfiguration.cs b/src/Ocelot/Configuration/File/FileGlobalConfiguration.cs index 7021efa38..e24564553 100644 --- a/src/Ocelot/Configuration/File/FileGlobalConfiguration.cs +++ b/src/Ocelot/Configuration/File/FileGlobalConfiguration.cs @@ -52,6 +52,7 @@ public FileGlobalConfiguration() public FileMetadataOptions MetadataOptions { get; set; } public Dictionary UpstreamHeaderTransform { get; set; } + public Dictionary DownstreamHeaderTransform { get; set; } } } From 75259fe12f579c06004dbe77ec380a9956fe3bfa Mon Sep 17 00:00:00 2001 From: Raman Maksimchuk Date: Sat, 3 Jun 2023 18:15:27 +0300 Subject: [PATCH 3/7] Fix DRY principle violation. Less code, more reusage. --- .../Creator/HeaderFindAndReplaceCreator.cs | 66 +++++++------------ 1 file changed, 24 insertions(+), 42 deletions(-) diff --git a/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs b/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs index 743189fc3..c58e983c2 100644 --- a/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs +++ b/src/Ocelot/Configuration/Creator/HeaderFindAndReplaceCreator.cs @@ -1,11 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Linq; using Microsoft.Extensions.Options; using Ocelot.Configuration.File; using Ocelot.Infrastructure; using Ocelot.Logging; using Ocelot.Responses; +using System; +using System.Collections.Generic; +using System.Linq; +using Header = System.Collections.Generic.KeyValuePair; namespace Ocelot.Configuration.Creator { @@ -24,66 +25,47 @@ public HeaderFindAndReplaceCreator(IOptions fileConfiguration public HeaderTransformations Create(FileRoute fileRoute) { - var upstream = new List(); - var addHeadersToUpstream = new List(); - var upstreamAdded = new HashSet(); - var upstreamHeaderTransform = Merge(fileRoute.UpstreamHeaderTransform, _fileGlobalConfiguration.UpstreamHeaderTransform); + var (upstream, addHeadersToUpstream) = ProcessHeaders(upstreamHeaderTransform, nameof(fileRoute.UpstreamHeaderTransform)); - foreach (var input in upstreamHeaderTransform) - { - if (input.Value.Contains(',')) - { - var hAndr = Map(input); - if (!hAndr.IsError) - { - upstream.Add(hAndr.Data); - upstreamAdded.Add(input.Key); - } - else - { - _logger.LogWarning($"Unable to add UpstreamHeaderTransform {input.Key}: {input.Value}"); - } - } - else - { - addHeadersToUpstream.Add(new AddHeader(input.Key, input.Value)); - upstreamAdded.Add(input.Key); - } - } + var downstreamHeaderTransform = Merge(fileRoute.DownstreamHeaderTransform, _fileGlobalConfiguration.DownstreamHeaderTransform); + var (downstream, addHeadersToDownstream) = ProcessHeaders(downstreamHeaderTransform, nameof(fileRoute.DownstreamHeaderTransform)); - var downstream = new List(); - var addHeadersToDownstream = new List(); - var downstreamAdded = new HashSet(); + return new HeaderTransformations(upstream, downstream, addHeadersToDownstream, addHeadersToUpstream); + } - var downstreamHeaderTransform = Merge(fileRoute.DownstreamHeaderTransform, _fileGlobalConfiguration.DownstreamHeaderTransform); + private (List StreamHeaders, List AddHeaders) ProcessHeaders(IEnumerable
headerTransform, string propertyName = null) + { + var headerPairs = headerTransform ?? Enumerable.Empty
(); + + var streamHeaders = new List(); + var addHeaders = new List(); - foreach (var input in downstreamHeaderTransform) + foreach (var input in headerPairs) { if (input.Value.Contains(',')) { var hAndr = Map(input); if (!hAndr.IsError) { - downstream.Add(hAndr.Data); - downstreamAdded.Add(input.Key); + streamHeaders.Add(hAndr.Data); } else { - _logger.LogWarning($"Unable to add DownstreamHeaderTransform {input.Key}: {input.Value}"); + var name = propertyName ?? "Headers Transformation"; + _logger.LogWarning($"Unable to add {name} {input.Key}: {input.Value}"); } } else { - addHeadersToDownstream.Add(new AddHeader(input.Key, input.Value)); - downstreamAdded.Add(input.Key); + addHeaders.Add(new AddHeader(input.Key, input.Value)); } } - - return new HeaderTransformations(upstream, downstream, addHeadersToDownstream, addHeadersToUpstream); + + return (streamHeaders, addHeaders); } - private Response Map(KeyValuePair input) + private Response Map(Header input) { var findAndReplace = input.Value.Split(','); @@ -117,7 +99,7 @@ private Response Map(KeyValuePair input) /// The Route local settings. /// Global default settings. /// An collection. - public static IEnumerable> Merge(Dictionary local, Dictionary global) + public static IEnumerable
Merge(Dictionary local, Dictionary global) { // Winning strategy: The Route local setting wins over global one var toAdd = global.ExceptBy(local.Keys, x => x.Key); From 270eccdc709ed5768b5f1aee5e207bc5d5a49e84 Mon Sep 17 00:00:00 2001 From: Raman Maksimchuk Date: Sat, 3 Jun 2023 19:26:27 +0300 Subject: [PATCH 4/7] Add "should_merge" unit test --- .../HeaderFindAndReplaceCreatorTests.cs | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs b/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs index 2936b914f..33bfda817 100644 --- a/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs +++ b/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs @@ -1,15 +1,16 @@ -using System.Collections.Generic; +using System.Collections.Generic; +using System.Linq; using Microsoft.Extensions.Options; -using Moq; - +using Moq; + using Ocelot.Configuration; using Ocelot.Configuration.Creator; using Ocelot.Configuration.File; using Ocelot.Infrastructure; using Ocelot.Logging; using Ocelot.Responses; -using Ocelot.UnitTests.Responder; - +using Ocelot.UnitTests.Responder; + namespace Ocelot.UnitTests.Configuration { public class HeaderFindAndReplaceCreatorTests : UnitTest @@ -277,6 +278,36 @@ public void should_add_upstream_header_as_is_when_no_replacement_is_given() .BDDfy(); } + [Fact] + public void should_merge() + { + // Arrange + var local = new Dictionary() + { + { "B", "localB" }, + { "C", "localC" }, + }; + var global = new Dictionary() + { + { "A", "globalA" }, + { "B", "globalB" }, + }; + + // Act + var actual = HeaderFindAndReplaceCreator.Merge(local, global); + + // Assert + actual.ShouldNotBeNull(); + var dictionary = actual.ToDictionary(x => x.Key, x => x.Value); + dictionary.Count.ShouldBe(3); + dictionary.ContainsKey("A").ShouldBeTrue(); + dictionary["A"].ShouldBe("globalA"); + dictionary.ContainsKey("B").ShouldBeTrue(); + dictionary["B"].ShouldBe("localB"); // local value wins over global one + dictionary.ContainsKey("C").ShouldBeTrue(); + dictionary["C"].ShouldBe("localC"); + } + private void GivenThePlaceholderIs(string placeholderValue) { _placeholders.Setup(x => x.Get(It.IsAny())).Returns(new OkResponse(placeholderValue)); From 72c09042b50c51090e2bda7490d8654a4e6b85ea Mon Sep 17 00:00:00 2001 From: raman-m Date: Tue, 20 Jun 2023 17:30:52 +0300 Subject: [PATCH 5/7] Fix SA1413: Use trailing comma --- .../HeaderFindAndReplaceCreatorTests.cs | 463 +++++++++--------- 1 file changed, 231 insertions(+), 232 deletions(-) diff --git a/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs b/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs index 33bfda817..da7b89b28 100644 --- a/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs +++ b/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs @@ -22,106 +22,106 @@ public class HeaderFindAndReplaceCreatorTests : UnitTest private readonly Mock _factory; private readonly Mock _logger; - public HeaderFindAndReplaceCreatorTests() + public HeaderFindAndReplaceCreatorTests() + { + _logger = new Mock(); + _factory = new Mock(); + _factory.Setup(x => x.CreateLogger()).Returns(_logger.Object); + _placeholders = new Mock(); + var fileGlobalConfiguration = new FileGlobalConfiguration(); + fileGlobalConfiguration.UpstreamHeaderTransform.Add("TestGlobal", "Test, Chicken"); + fileGlobalConfiguration.UpstreamHeaderTransform.Add("MoopGlobal", "o, a"); + fileGlobalConfiguration.DownstreamHeaderTransform.Add("PopGlobal", "West, East"); + fileGlobalConfiguration.DownstreamHeaderTransform.Add("BopGlobal", "e, r"); + + var options = new Mock>(); + options.Setup(x => x.Value).Returns(new FileConfiguration { - _logger = new Mock(); - _factory = new Mock(); - _factory.Setup(x => x.CreateLogger()).Returns(_logger.Object); - _placeholders = new Mock(); - var fileGlobalConfiguration = new FileGlobalConfiguration(); - fileGlobalConfiguration.UpstreamHeaderTransform.Add("TestGlobal", "Test, Chicken"); - fileGlobalConfiguration.UpstreamHeaderTransform.Add("MoopGlobal", "o, a"); - fileGlobalConfiguration.DownstreamHeaderTransform.Add("PopGlobal", "West, East"); - fileGlobalConfiguration.DownstreamHeaderTransform.Add("BopGlobal", "e, r"); - - var options = new Mock>(); - options.Setup(x => x.Value).Returns(new FileConfiguration - { - GlobalConfiguration = fileGlobalConfiguration, - }); + GlobalConfiguration = fileGlobalConfiguration, + }); - _creator = new HeaderFindAndReplaceCreator(options.Object, _placeholders.Object, _factory.Object); - } + _creator = new HeaderFindAndReplaceCreator(options.Object, _placeholders.Object, _factory.Object); + } - [Fact] - public void should_create() + [Fact] + public void should_create() + { + var route = new FileRoute { - var route = new FileRoute - { - UpstreamHeaderTransform = new Dictionary - { - {"Test", "Test, Chicken"}, - {"Moop", "o, a"}, - }, - DownstreamHeaderTransform = new Dictionary - { - {"Pop", "West, East"}, - {"Bop", "e, r"}, - }, - }; - - var upstream = new List + UpstreamHeaderTransform = new Dictionary { - new("Test", "Test", "Chicken", 0), - new("Moop", "o", "a", 0), - new("TestGlobal", "Test", "Chicken", 0), - new("MoopGlobal", "o", "a", 0), - }; - - var downstream = new List + {"Test", "Test, Chicken"}, + {"Moop", "o, a"}, + }, + DownstreamHeaderTransform = new Dictionary { - new("Pop", "West", "East", 0), - new("Bop", "e", "r", 0), - new("PopGlobal", "West", "East", 0), - new("BopGlobal", "e", "r", 0), - }; + {"Pop", "West, East"}, + {"Bop", "e, r"}, + }, + }; - this.Given(x => GivenTheRoute(route)) - .When(x => WhenICreate()) - .Then(x => ThenTheFollowingUpstreamIsReturned(upstream)) - .Then(x => ThenTheFollowingDownstreamIsReturned(downstream)) - .BDDfy(); - } + var upstream = new List + { + new("Test", "Test", "Chicken", 0), + new("Moop", "o", "a", 0), + new("TestGlobal", "Test", "Chicken", 0), + new("MoopGlobal", "o", "a", 0), + }; - [Fact] - public void should_create_with_add_headers_to_request() + var downstream = new List { - const string key = "X-Forwarded-For"; - const string value = "{RemoteIpAddress}"; + new("Pop", "West", "East", 0), + new("Bop", "e", "r", 0), + new("PopGlobal", "West", "East", 0), + new("BopGlobal", "e", "r", 0), + }; + + this.Given(x => GivenTheRoute(route)) + .When(x => WhenICreate()) + .Then(x => ThenTheFollowingUpstreamIsReturned(upstream)) + .Then(x => ThenTheFollowingDownstreamIsReturned(downstream)) + .BDDfy(); + } - var route = new FileRoute + [Fact] + public void should_create_with_add_headers_to_request() + { + const string key = "X-Forwarded-For"; + const string value = "{RemoteIpAddress}"; + + var route = new FileRoute + { + UpstreamHeaderTransform = new Dictionary { - UpstreamHeaderTransform = new Dictionary - { - {key, value}, - }, - }; + {key, value}, + }, + }; - var expected = new AddHeader(key, value); + var expected = new AddHeader(key, value); - this.Given(x => GivenTheRoute(route)) - .When(x => WhenICreate()) - .Then(x => ThenTheFollowingAddHeaderToUpstreamIsReturned(expected)) - .BDDfy(); - } + this.Given(x => GivenTheRoute(route)) + .When(x => WhenICreate()) + .Then(x => ThenTheFollowingAddHeaderToUpstreamIsReturned(expected)) + .BDDfy(); + } - [Fact] - public void should_use_base_url_placeholder() + [Fact] + public void should_use_base_url_placeholder() + { + var route = new FileRoute { - var route = new FileRoute + DownstreamHeaderTransform = new Dictionary { - DownstreamHeaderTransform = new Dictionary - { - {"Location", "http://www.bbc.co.uk/, {BaseUrl}"}, - }, - }; + {"Location", "http://www.bbc.co.uk/, {BaseUrl}"}, + }, + }; - var downstream = new List - { - new("Location", "http://www.bbc.co.uk/", "http://ocelot.com/", 0), - new("PopGlobal", "West", "East", 0), - new("BopGlobal", "e", "r", 0), - }; + var downstream = new List + { + new("Location", "http://www.bbc.co.uk/", "http://ocelot.com/", 0), + new("PopGlobal", "West", "East", 0), + new("BopGlobal", "e", "r", 0), + }; this.Given(x => GivenTheRoute(route)) .And(x => GivenThePlaceholderIs("http://ocelot.com/")) @@ -130,65 +130,65 @@ public void should_use_base_url_placeholder() .BDDfy(); } - [Fact] - public void should_log_errors_and_not_add_headers() + [Fact] + public void should_log_errors_and_not_add_headers() + { + var route = new FileRoute { - var route = new FileRoute - { - DownstreamHeaderTransform = new Dictionary - { - {"Location", "http://www.bbc.co.uk/, {BaseUrl}"}, - }, - UpstreamHeaderTransform = new Dictionary - { - {"Location", "http://www.bbc.co.uk/, {BaseUrl}"}, - }, - }; - - var expectedDownstream = new List + DownstreamHeaderTransform = new Dictionary { - new("PopGlobal", "West", "East", 0), - new("BopGlobal", "e", "r", 0), - }; - - var expectedUpstream = new List + {"Location", "http://www.bbc.co.uk/, {BaseUrl}"}, + }, + UpstreamHeaderTransform = new Dictionary { - new("TestGlobal", "Test", "Chicken", 0), - new("MoopGlobal", "o", "a", 0), - }; + {"Location", "http://www.bbc.co.uk/, {BaseUrl}"}, + }, + }; - this.Given(x => GivenTheRoute(route)) - .And(x => GivenTheBaseUrlErrors()) - .When(x => WhenICreate()) - .Then(x => ThenTheFollowingDownstreamIsReturned(expectedDownstream)) - .And(x => ThenTheFollowingUpstreamIsReturned(expectedUpstream)) - .And(x => ThenTheLoggerIsCalledCorrectly("Unable to add DownstreamHeaderTransform Location: http://www.bbc.co.uk/, {BaseUrl}")) - .And(x => ThenTheLoggerIsCalledCorrectly("Unable to add UpstreamHeaderTransform Location: http://www.bbc.co.uk/, {BaseUrl}")) - .BDDfy(); - } + var expectedDownstream = new List + { + new("PopGlobal", "West", "East", 0), + new("BopGlobal", "e", "r", 0), + }; + + var expectedUpstream = new List + { + new("TestGlobal", "Test", "Chicken", 0), + new("MoopGlobal", "o", "a", 0), + }; + + this.Given(x => GivenTheRoute(route)) + .And(x => GivenTheBaseUrlErrors()) + .When(x => WhenICreate()) + .Then(x => ThenTheFollowingDownstreamIsReturned(expectedDownstream)) + .And(x => ThenTheFollowingUpstreamIsReturned(expectedUpstream)) + .And(x => ThenTheLoggerIsCalledCorrectly("Unable to add DownstreamHeaderTransform Location: http://www.bbc.co.uk/, {BaseUrl}")) + .And(x => ThenTheLoggerIsCalledCorrectly("Unable to add UpstreamHeaderTransform Location: http://www.bbc.co.uk/, {BaseUrl}")) + .BDDfy(); + } private void ThenTheLoggerIsCalledCorrectly(string message) { _logger.Verify(x => x.LogWarning(It.Is>(y => y.Invoke() == message)), Times.Once); } - [Fact] - public void should_use_base_url_partial_placeholder() + [Fact] + public void should_use_base_url_partial_placeholder() + { + var route = new FileRoute { - var route = new FileRoute + DownstreamHeaderTransform = new Dictionary { - DownstreamHeaderTransform = new Dictionary - { - {"Location", "http://www.bbc.co.uk/pay, {BaseUrl}pay"}, - }, - }; + {"Location", "http://www.bbc.co.uk/pay, {BaseUrl}pay"}, + }, + }; - var downstream = new List - { - new("Location", "http://www.bbc.co.uk/pay", "http://ocelot.com/pay", 0), - new("PopGlobal", "West", "East", 0), - new("BopGlobal", "e", "r", 0), - }; + var downstream = new List + { + new("Location", "http://www.bbc.co.uk/pay", "http://ocelot.com/pay", 0), + new("PopGlobal", "West", "East", 0), + new("BopGlobal", "e", "r", 0), + }; this.Given(x => GivenTheRoute(route)) .And(x => GivenThePlaceholderIs("http://ocelot.com/")) @@ -231,7 +231,7 @@ public void should_add_trace_id_header() }, }; - var expected = new AddHeader("Trace-Id", "{TraceId}"); + var expected = new AddHeader("Trace-Id", "{TraceId}"); this.Given(x => GivenTheRoute(route)) .And(x => GivenThePlaceholderIs("http://ocelot.com/")) @@ -240,134 +240,133 @@ public void should_add_trace_id_header() .BDDfy(); } - [Fact] - public void should_add_downstream_header_as_is_when_no_replacement_is_given() + [Fact] + public void should_add_downstream_header_as_is_when_no_replacement_is_given() + { + var route = new FileRoute { - var route = new FileRoute + DownstreamHeaderTransform = new Dictionary { - DownstreamHeaderTransform = new Dictionary - { - {"X-Custom-Header", "Value"}, - }, - }; + {"X-Custom-Header", "Value"}, + }, + }; - var expected = new AddHeader("X-Custom-Header", "Value"); + var expected = new AddHeader("X-Custom-Header", "Value"); - this.Given(x => GivenTheRoute(route)) - .And(x => WhenICreate()) - .Then(x => x.ThenTheFollowingAddHeaderToDownstreamIsReturned(expected)) - .BDDfy(); - } + this.Given(x => GivenTheRoute(route)) + .And(x => WhenICreate()) + .Then(x => x.ThenTheFollowingAddHeaderToDownstreamIsReturned(expected)) + .BDDfy(); + } - [Fact] - public void should_add_upstream_header_as_is_when_no_replacement_is_given() + [Fact] + public void should_add_upstream_header_as_is_when_no_replacement_is_given() + { + var route = new FileRoute { - var route = new FileRoute + UpstreamHeaderTransform = new Dictionary { - UpstreamHeaderTransform = new Dictionary - { - {"X-Custom-Header", "Value"}, - }, - }; + {"X-Custom-Header", "Value"}, + }, + }; - var expected = new AddHeader("X-Custom-Header", "Value"); + var expected = new AddHeader("X-Custom-Header", "Value"); - this.Given(x => GivenTheRoute(route)) - .And(x => WhenICreate()) - .Then(x => x.ThenTheFollowingAddHeaderToUpstreamIsReturned(expected)) - .BDDfy(); - } + this.Given(x => GivenTheRoute(route)) + .And(x => WhenICreate()) + .Then(x => x.ThenTheFollowingAddHeaderToUpstreamIsReturned(expected)) + .BDDfy(); + } - [Fact] - public void should_merge() + [Fact] + public void should_merge() + { + // Arrange + var local = new Dictionary() { - // Arrange - var local = new Dictionary() - { - { "B", "localB" }, - { "C", "localC" }, - }; - var global = new Dictionary() - { - { "A", "globalA" }, - { "B", "globalB" }, - }; - - // Act - var actual = HeaderFindAndReplaceCreator.Merge(local, global); - - // Assert - actual.ShouldNotBeNull(); - var dictionary = actual.ToDictionary(x => x.Key, x => x.Value); - dictionary.Count.ShouldBe(3); - dictionary.ContainsKey("A").ShouldBeTrue(); - dictionary["A"].ShouldBe("globalA"); - dictionary.ContainsKey("B").ShouldBeTrue(); - dictionary["B"].ShouldBe("localB"); // local value wins over global one - dictionary.ContainsKey("C").ShouldBeTrue(); - dictionary["C"].ShouldBe("localC"); - } + { "B", "localB" }, + { "C", "localC" }, + }; + var global = new Dictionary() + { + { "A", "globalA" }, + { "B", "globalB" }, + }; + + // Act + var actual = HeaderFindAndReplaceCreator.Merge(local, global); + + // Assert + actual.ShouldNotBeNull(); + var dictionary = actual.ToDictionary(x => x.Key, x => x.Value); + dictionary.Count.ShouldBe(3); + dictionary.ContainsKey("A").ShouldBeTrue(); + dictionary["A"].ShouldBe("globalA"); + dictionary.ContainsKey("B").ShouldBeTrue(); + dictionary["B"].ShouldBe("localB"); // local value wins over global one + dictionary.ContainsKey("C").ShouldBeTrue(); + dictionary["C"].ShouldBe("localC"); + } private void GivenThePlaceholderIs(string placeholderValue) { _placeholders.Setup(x => x.Get(It.IsAny())).Returns(new OkResponse(placeholderValue)); } - private void GivenTheBaseUrlErrors() - { - _placeholders.Setup(x => x.Get(It.IsAny())).Returns(new ErrorResponse(new AnyError())); - } - - private void ThenTheFollowingAddHeaderToDownstreamIsReturned(AddHeader addHeader) - { - _result.AddHeadersToDownstream[0].Key.ShouldBe(addHeader.Key); - _result.AddHeadersToDownstream[0].Value.ShouldBe(addHeader.Value); - } + private void GivenTheBaseUrlErrors() + { + _placeholders.Setup(x => x.Get(It.IsAny())).Returns(new ErrorResponse(new AnyError())); + } - private void ThenTheFollowingAddHeaderToUpstreamIsReturned(AddHeader addHeader) - { - _result.AddHeadersToUpstream[0].Key.ShouldBe(addHeader.Key); - _result.AddHeadersToUpstream[0].Value.ShouldBe(addHeader.Value); - } + private void ThenTheFollowingAddHeaderToDownstreamIsReturned(AddHeader addHeader) + { + _result.AddHeadersToDownstream[0].Key.ShouldBe(addHeader.Key); + _result.AddHeadersToDownstream[0].Value.ShouldBe(addHeader.Value); + } - private void ThenTheFollowingDownstreamIsReturned(List downstream) - { - _result.Downstream.Count.ShouldBe(downstream.Count); + private void ThenTheFollowingAddHeaderToUpstreamIsReturned(AddHeader addHeader) + { + _result.AddHeadersToUpstream[0].Key.ShouldBe(addHeader.Key); + _result.AddHeadersToUpstream[0].Value.ShouldBe(addHeader.Value); + } - for (var i = 0; i < _result.Downstream.Count; i++) - { - var result = _result.Downstream[i]; - var expected = downstream[i]; - result.Find.ShouldBe(expected.Find); - result.Index.ShouldBe(expected.Index); - result.Key.ShouldBe(expected.Key); - result.Replace.ShouldBe(expected.Replace); - } - } + private void ThenTheFollowingDownstreamIsReturned(List downstream) + { + _result.Downstream.Count.ShouldBe(downstream.Count); - private void GivenTheRoute(FileRoute route) + for (var i = 0; i < _result.Downstream.Count; i++) { - _route = route; + var result = _result.Downstream[i]; + var expected = downstream[i]; + result.Find.ShouldBe(expected.Find); + result.Index.ShouldBe(expected.Index); + result.Key.ShouldBe(expected.Key); + result.Replace.ShouldBe(expected.Replace); } + } - private void WhenICreate() - { - _result = _creator.Create(_route); - } + private void GivenTheRoute(FileRoute route) + { + _route = route; + } - private void ThenTheFollowingUpstreamIsReturned(List expecteds) - { - _result.Upstream.Count.ShouldBe(expecteds.Count); + private void WhenICreate() + { + _result = _creator.Create(_route); + } - for (var i = 0; i < _result.Upstream.Count; i++) - { - var result = _result.Upstream[i]; - var expected = expecteds[i]; - result.Find.ShouldBe(expected.Find); - result.Index.ShouldBe(expected.Index); - result.Key.ShouldBe(expected.Key); - result.Replace.ShouldBe(expected.Replace); - } + private void ThenTheFollowingUpstreamIsReturned(List expecteds) + { + _result.Upstream.Count.ShouldBe(expecteds.Count); + + for (var i = 0; i < _result.Upstream.Count; i++) + { + var result = _result.Upstream[i]; + var expected = expecteds[i]; + result.Find.ShouldBe(expected.Find); + result.Index.ShouldBe(expected.Index); + result.Key.ShouldBe(expected.Key); + result.Replace.ShouldBe(expected.Replace); } } } From b26cc2d1ef5c8f18c429a6430ec5a41c2499a590 Mon Sep 17 00:00:00 2001 From: raman-m Date: Fri, 8 Sep 2023 18:06:46 +0300 Subject: [PATCH 6/7] Convert to block scoped namespace --- .../HeaderFindAndReplaceCreatorTests.cs | 394 +++++++++--------- 1 file changed, 198 insertions(+), 196 deletions(-) diff --git a/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs b/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs index da7b89b28..56512c63a 100644 --- a/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs +++ b/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; + using Microsoft.Extensions.Options; using Moq; @@ -22,45 +23,45 @@ public class HeaderFindAndReplaceCreatorTests : UnitTest private readonly Mock _factory; private readonly Mock _logger; - public HeaderFindAndReplaceCreatorTests() - { - _logger = new Mock(); - _factory = new Mock(); - _factory.Setup(x => x.CreateLogger()).Returns(_logger.Object); - _placeholders = new Mock(); - var fileGlobalConfiguration = new FileGlobalConfiguration(); - fileGlobalConfiguration.UpstreamHeaderTransform.Add("TestGlobal", "Test, Chicken"); - fileGlobalConfiguration.UpstreamHeaderTransform.Add("MoopGlobal", "o, a"); - fileGlobalConfiguration.DownstreamHeaderTransform.Add("PopGlobal", "West, East"); - fileGlobalConfiguration.DownstreamHeaderTransform.Add("BopGlobal", "e, r"); - - var options = new Mock>(); - options.Setup(x => x.Value).Returns(new FileConfiguration - { - GlobalConfiguration = fileGlobalConfiguration, - }); - - _creator = new HeaderFindAndReplaceCreator(options.Object, _placeholders.Object, _factory.Object); - } - - [Fact] - public void should_create() - { - var route = new FileRoute - { - UpstreamHeaderTransform = new Dictionary + public HeaderFindAndReplaceCreatorTests() + { + _logger = new Mock(); + _factory = new Mock(); + _factory.Setup(x => x.CreateLogger()).Returns(_logger.Object); + _placeholders = new Mock(); + var fileGlobalConfiguration = new FileGlobalConfiguration(); + fileGlobalConfiguration.UpstreamHeaderTransform.Add("TestGlobal", "Test, Chicken"); + fileGlobalConfiguration.UpstreamHeaderTransform.Add("MoopGlobal", "o, a"); + fileGlobalConfiguration.DownstreamHeaderTransform.Add("PopGlobal", "West, East"); + fileGlobalConfiguration.DownstreamHeaderTransform.Add("BopGlobal", "e, r"); + + var options = new Mock>(); + options.Setup(x => x.Value).Returns(new FileConfiguration + { + GlobalConfiguration = fileGlobalConfiguration, + }); + + _creator = new HeaderFindAndReplaceCreator(options.Object, _placeholders.Object, _factory.Object); + } + + [Fact] + public void should_create() + { + var route = new FileRoute + { + UpstreamHeaderTransform = new Dictionary { {"Test", "Test, Chicken"}, {"Moop", "o, a"}, }, - DownstreamHeaderTransform = new Dictionary + DownstreamHeaderTransform = new Dictionary { {"Pop", "West, East"}, {"Bop", "e, r"}, }, - }; + }; - var upstream = new List + var upstream = new List { new("Test", "Test", "Chicken", 0), new("Moop", "o", "a", 0), @@ -68,7 +69,7 @@ public void should_create() new("MoopGlobal", "o", "a", 0), }; - var downstream = new List + var downstream = new List { new("Pop", "West", "East", 0), new("Bop", "e", "r", 0), @@ -76,47 +77,47 @@ public void should_create() new("BopGlobal", "e", "r", 0), }; - this.Given(x => GivenTheRoute(route)) - .When(x => WhenICreate()) - .Then(x => ThenTheFollowingUpstreamIsReturned(upstream)) - .Then(x => ThenTheFollowingDownstreamIsReturned(downstream)) - .BDDfy(); - } - - [Fact] - public void should_create_with_add_headers_to_request() - { - const string key = "X-Forwarded-For"; - const string value = "{RemoteIpAddress}"; - - var route = new FileRoute - { - UpstreamHeaderTransform = new Dictionary + this.Given(x => GivenTheRoute(route)) + .When(x => WhenICreate()) + .Then(x => ThenTheFollowingUpstreamIsReturned(upstream)) + .Then(x => ThenTheFollowingDownstreamIsReturned(downstream)) + .BDDfy(); + } + + [Fact] + public void should_create_with_add_headers_to_request() + { + const string key = "X-Forwarded-For"; + const string value = "{RemoteIpAddress}"; + + var route = new FileRoute + { + UpstreamHeaderTransform = new Dictionary { {key, value}, }, - }; + }; - var expected = new AddHeader(key, value); + var expected = new AddHeader(key, value); - this.Given(x => GivenTheRoute(route)) - .When(x => WhenICreate()) - .Then(x => ThenTheFollowingAddHeaderToUpstreamIsReturned(expected)) - .BDDfy(); - } + this.Given(x => GivenTheRoute(route)) + .When(x => WhenICreate()) + .Then(x => ThenTheFollowingAddHeaderToUpstreamIsReturned(expected)) + .BDDfy(); + } - [Fact] - public void should_use_base_url_placeholder() - { - var route = new FileRoute - { - DownstreamHeaderTransform = new Dictionary + [Fact] + public void should_use_base_url_placeholder() + { + var route = new FileRoute + { + DownstreamHeaderTransform = new Dictionary { {"Location", "http://www.bbc.co.uk/, {BaseUrl}"}, }, - }; + }; - var downstream = new List + var downstream = new List { new("Location", "http://www.bbc.co.uk/", "http://ocelot.com/", 0), new("PopGlobal", "West", "East", 0), @@ -130,60 +131,60 @@ public void should_use_base_url_placeholder() .BDDfy(); } - [Fact] - public void should_log_errors_and_not_add_headers() - { - var route = new FileRoute - { - DownstreamHeaderTransform = new Dictionary + [Fact] + public void should_log_errors_and_not_add_headers() + { + var route = new FileRoute + { + DownstreamHeaderTransform = new Dictionary { {"Location", "http://www.bbc.co.uk/, {BaseUrl}"}, }, - UpstreamHeaderTransform = new Dictionary + UpstreamHeaderTransform = new Dictionary { {"Location", "http://www.bbc.co.uk/, {BaseUrl}"}, }, - }; + }; - var expectedDownstream = new List + var expectedDownstream = new List { new("PopGlobal", "West", "East", 0), new("BopGlobal", "e", "r", 0), }; - - var expectedUpstream = new List + + var expectedUpstream = new List { new("TestGlobal", "Test", "Chicken", 0), new("MoopGlobal", "o", "a", 0), }; - this.Given(x => GivenTheRoute(route)) - .And(x => GivenTheBaseUrlErrors()) - .When(x => WhenICreate()) - .Then(x => ThenTheFollowingDownstreamIsReturned(expectedDownstream)) - .And(x => ThenTheFollowingUpstreamIsReturned(expectedUpstream)) - .And(x => ThenTheLoggerIsCalledCorrectly("Unable to add DownstreamHeaderTransform Location: http://www.bbc.co.uk/, {BaseUrl}")) - .And(x => ThenTheLoggerIsCalledCorrectly("Unable to add UpstreamHeaderTransform Location: http://www.bbc.co.uk/, {BaseUrl}")) - .BDDfy(); - } + this.Given(x => GivenTheRoute(route)) + .And(x => GivenTheBaseUrlErrors()) + .When(x => WhenICreate()) + .Then(x => ThenTheFollowingDownstreamIsReturned(expectedDownstream)) + .And(x => ThenTheFollowingUpstreamIsReturned(expectedUpstream)) + .And(x => ThenTheLoggerIsCalledCorrectly("Unable to add DownstreamHeaderTransform Location: http://www.bbc.co.uk/, {BaseUrl}")) + .And(x => ThenTheLoggerIsCalledCorrectly("Unable to add UpstreamHeaderTransform Location: http://www.bbc.co.uk/, {BaseUrl}")) + .BDDfy(); + } private void ThenTheLoggerIsCalledCorrectly(string message) { _logger.Verify(x => x.LogWarning(It.Is>(y => y.Invoke() == message)), Times.Once); } - [Fact] - public void should_use_base_url_partial_placeholder() - { - var route = new FileRoute - { - DownstreamHeaderTransform = new Dictionary + [Fact] + public void should_use_base_url_partial_placeholder() + { + var route = new FileRoute + { + DownstreamHeaderTransform = new Dictionary { {"Location", "http://www.bbc.co.uk/pay, {BaseUrl}pay"}, }, - }; + }; - var downstream = new List + var downstream = new List { new("Location", "http://www.bbc.co.uk/pay", "http://ocelot.com/pay", 0), new("PopGlobal", "West", "East", 0), @@ -231,7 +232,7 @@ public void should_add_trace_id_header() }, }; - var expected = new AddHeader("Trace-Id", "{TraceId}"); + var expected = new AddHeader("Trace-Id", "{TraceId}"); this.Given(x => GivenTheRoute(route)) .And(x => GivenThePlaceholderIs("http://ocelot.com/")) @@ -240,133 +241,134 @@ public void should_add_trace_id_header() .BDDfy(); } - [Fact] - public void should_add_downstream_header_as_is_when_no_replacement_is_given() - { - var route = new FileRoute - { - DownstreamHeaderTransform = new Dictionary + [Fact] + public void should_add_downstream_header_as_is_when_no_replacement_is_given() + { + var route = new FileRoute + { + DownstreamHeaderTransform = new Dictionary { {"X-Custom-Header", "Value"}, }, - }; - - var expected = new AddHeader("X-Custom-Header", "Value"); - - this.Given(x => GivenTheRoute(route)) - .And(x => WhenICreate()) - .Then(x => x.ThenTheFollowingAddHeaderToDownstreamIsReturned(expected)) - .BDDfy(); - } - - [Fact] - public void should_add_upstream_header_as_is_when_no_replacement_is_given() - { - var route = new FileRoute - { - UpstreamHeaderTransform = new Dictionary + }; + + var expected = new AddHeader("X-Custom-Header", "Value"); + + this.Given(x => GivenTheRoute(route)) + .And(x => WhenICreate()) + .Then(x => x.ThenTheFollowingAddHeaderToDownstreamIsReturned(expected)) + .BDDfy(); + } + + [Fact] + public void should_add_upstream_header_as_is_when_no_replacement_is_given() + { + var route = new FileRoute + { + UpstreamHeaderTransform = new Dictionary { {"X-Custom-Header", "Value"}, }, - }; + }; - var expected = new AddHeader("X-Custom-Header", "Value"); + var expected = new AddHeader("X-Custom-Header", "Value"); - this.Given(x => GivenTheRoute(route)) - .And(x => WhenICreate()) - .Then(x => x.ThenTheFollowingAddHeaderToUpstreamIsReturned(expected)) - .BDDfy(); - } + this.Given(x => GivenTheRoute(route)) + .And(x => WhenICreate()) + .Then(x => x.ThenTheFollowingAddHeaderToUpstreamIsReturned(expected)) + .BDDfy(); + } - [Fact] - public void should_merge() - { - // Arrange - var local = new Dictionary() + [Fact] + public void should_merge() + { + // Arrange + var local = new Dictionary() { { "B", "localB" }, { "C", "localC" }, }; - var global = new Dictionary() + var global = new Dictionary() { { "A", "globalA" }, { "B", "globalB" }, }; - // Act - var actual = HeaderFindAndReplaceCreator.Merge(local, global); - - // Assert - actual.ShouldNotBeNull(); - var dictionary = actual.ToDictionary(x => x.Key, x => x.Value); - dictionary.Count.ShouldBe(3); - dictionary.ContainsKey("A").ShouldBeTrue(); - dictionary["A"].ShouldBe("globalA"); - dictionary.ContainsKey("B").ShouldBeTrue(); - dictionary["B"].ShouldBe("localB"); // local value wins over global one - dictionary.ContainsKey("C").ShouldBeTrue(); - dictionary["C"].ShouldBe("localC"); - } + // Act + var actual = HeaderFindAndReplaceCreator.Merge(local, global); + + // Assert + actual.ShouldNotBeNull(); + var dictionary = actual.ToDictionary(x => x.Key, x => x.Value); + dictionary.Count.ShouldBe(3); + dictionary.ContainsKey("A").ShouldBeTrue(); + dictionary["A"].ShouldBe("globalA"); + dictionary.ContainsKey("B").ShouldBeTrue(); + dictionary["B"].ShouldBe("localB"); // local value wins over global one + dictionary.ContainsKey("C").ShouldBeTrue(); + dictionary["C"].ShouldBe("localC"); + } private void GivenThePlaceholderIs(string placeholderValue) { _placeholders.Setup(x => x.Get(It.IsAny())).Returns(new OkResponse(placeholderValue)); } - private void GivenTheBaseUrlErrors() - { - _placeholders.Setup(x => x.Get(It.IsAny())).Returns(new ErrorResponse(new AnyError())); - } - - private void ThenTheFollowingAddHeaderToDownstreamIsReturned(AddHeader addHeader) - { - _result.AddHeadersToDownstream[0].Key.ShouldBe(addHeader.Key); - _result.AddHeadersToDownstream[0].Value.ShouldBe(addHeader.Value); - } - - private void ThenTheFollowingAddHeaderToUpstreamIsReturned(AddHeader addHeader) - { - _result.AddHeadersToUpstream[0].Key.ShouldBe(addHeader.Key); - _result.AddHeadersToUpstream[0].Value.ShouldBe(addHeader.Value); - } - - private void ThenTheFollowingDownstreamIsReturned(List downstream) - { - _result.Downstream.Count.ShouldBe(downstream.Count); - - for (var i = 0; i < _result.Downstream.Count; i++) - { - var result = _result.Downstream[i]; - var expected = downstream[i]; - result.Find.ShouldBe(expected.Find); - result.Index.ShouldBe(expected.Index); - result.Key.ShouldBe(expected.Key); - result.Replace.ShouldBe(expected.Replace); - } - } - - private void GivenTheRoute(FileRoute route) - { - _route = route; - } - - private void WhenICreate() - { - _result = _creator.Create(_route); - } - - private void ThenTheFollowingUpstreamIsReturned(List expecteds) - { - _result.Upstream.Count.ShouldBe(expecteds.Count); - - for (var i = 0; i < _result.Upstream.Count; i++) - { - var result = _result.Upstream[i]; - var expected = expecteds[i]; - result.Find.ShouldBe(expected.Find); - result.Index.ShouldBe(expected.Index); - result.Key.ShouldBe(expected.Key); - result.Replace.ShouldBe(expected.Replace); - } + private void GivenTheBaseUrlErrors() + { + _placeholders.Setup(x => x.Get(It.IsAny())).Returns(new ErrorResponse(new AnyError())); + } + + private void ThenTheFollowingAddHeaderToDownstreamIsReturned(AddHeader addHeader) + { + _result.AddHeadersToDownstream[0].Key.ShouldBe(addHeader.Key); + _result.AddHeadersToDownstream[0].Value.ShouldBe(addHeader.Value); + } + + private void ThenTheFollowingAddHeaderToUpstreamIsReturned(AddHeader addHeader) + { + _result.AddHeadersToUpstream[0].Key.ShouldBe(addHeader.Key); + _result.AddHeadersToUpstream[0].Value.ShouldBe(addHeader.Value); + } + + private void ThenTheFollowingDownstreamIsReturned(List downstream) + { + _result.Downstream.Count.ShouldBe(downstream.Count); + + for (var i = 0; i < _result.Downstream.Count; i++) + { + var result = _result.Downstream[i]; + var expected = downstream[i]; + result.Find.ShouldBe(expected.Find); + result.Index.ShouldBe(expected.Index); + result.Key.ShouldBe(expected.Key); + result.Replace.ShouldBe(expected.Replace); + } + } + + private void GivenTheRoute(FileRoute route) + { + _route = route; + } + + private void WhenICreate() + { + _result = _creator.Create(_route); + } + + private void ThenTheFollowingUpstreamIsReturned(List expecteds) + { + _result.Upstream.Count.ShouldBe(expecteds.Count); + + for (var i = 0; i < _result.Upstream.Count; i++) + { + var result = _result.Upstream[i]; + var expected = expecteds[i]; + result.Find.ShouldBe(expected.Find); + result.Index.ShouldBe(expected.Index); + result.Key.ShouldBe(expected.Key); + result.Replace.ShouldBe(expected.Replace); + } + } } -} +} From 44b047be2fe65602bbe4ad5b75676852ef84c1a9 Mon Sep 17 00:00:00 2001 From: raman-m Date: Fri, 8 Sep 2023 18:14:38 +0300 Subject: [PATCH 7/7] IDE1006 Naming rule violation: These words must begin with upper case characters: should_* --- .../HeaderFindAndReplaceCreatorTests.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs b/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs index 56512c63a..ae3a458b0 100644 --- a/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs +++ b/test/Ocelot.UnitTests/Configuration/HeaderFindAndReplaceCreatorTests.cs @@ -45,7 +45,7 @@ public HeaderFindAndReplaceCreatorTests() } [Fact] - public void should_create() + public void Should_create() { var route = new FileRoute { @@ -85,7 +85,7 @@ public void should_create() } [Fact] - public void should_create_with_add_headers_to_request() + public void Should_create_with_add_headers_to_request() { const string key = "X-Forwarded-For"; const string value = "{RemoteIpAddress}"; @@ -107,7 +107,7 @@ public void should_create_with_add_headers_to_request() } [Fact] - public void should_use_base_url_placeholder() + public void Should_use_base_url_placeholder() { var route = new FileRoute { @@ -132,7 +132,7 @@ public void should_use_base_url_placeholder() } [Fact] - public void should_log_errors_and_not_add_headers() + public void Should_log_errors_and_not_add_headers() { var route = new FileRoute { @@ -174,7 +174,7 @@ private void ThenTheLoggerIsCalledCorrectly(string message) } [Fact] - public void should_use_base_url_partial_placeholder() + public void Should_use_base_url_partial_placeholder() { var route = new FileRoute { @@ -222,7 +222,7 @@ public void should_map_with_partial_placeholder_in_the_middle() } [Fact] - public void should_add_trace_id_header() + public void Should_add_trace_id_header() { var route = new FileRoute { @@ -242,7 +242,7 @@ public void should_add_trace_id_header() } [Fact] - public void should_add_downstream_header_as_is_when_no_replacement_is_given() + public void Should_add_downstream_header_as_is_when_no_replacement_is_given() { var route = new FileRoute { @@ -261,7 +261,7 @@ public void should_add_downstream_header_as_is_when_no_replacement_is_given() } [Fact] - public void should_add_upstream_header_as_is_when_no_replacement_is_given() + public void Should_add_upstream_header_as_is_when_no_replacement_is_given() { var route = new FileRoute { @@ -280,7 +280,7 @@ public void should_add_upstream_header_as_is_when_no_replacement_is_given() } [Fact] - public void should_merge() + public void Should_merge() { // Arrange var local = new Dictionary()