diff --git a/tests/InvestProvider.Backend.Tests/EnvironmentVariableScope.cs b/tests/InvestProvider.Backend.Tests/EnvironmentVariableScope.cs new file mode 100644 index 0000000..4bbf6a4 --- /dev/null +++ b/tests/InvestProvider.Backend.Tests/EnvironmentVariableScope.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; + +namespace InvestProvider.Backend.Tests; + +public sealed class EnvironmentVariableScope : IDisposable +{ + private readonly IReadOnlyList _keys; + private readonly string?[] _values; + + private EnvironmentVariableScope(IReadOnlyList keys, string?[] values) + { + _keys = keys; + _values = values; + } + + public static EnvironmentVariableScope Set(string key, string? value) + { + var previousValue = Environment.GetEnvironmentVariable(key); + Environment.SetEnvironmentVariable(key, value); + return new EnvironmentVariableScope([key], [previousValue]); + } + + public static EnvironmentVariableScope Set(IDictionary variables) + { + var keys = new List(variables.Count); + var values = new string?[variables.Count]; + var index = 0; + + foreach (var (key, value) in variables) + { + keys.Add(key); + values[index] = Environment.GetEnvironmentVariable(key); + Environment.SetEnvironmentVariable(key, value); + index++; + } + + return new EnvironmentVariableScope(keys, values); + } + + public void Dispose() + { + for (var i = 0; i < _keys.Count; i++) + { + Environment.SetEnvironmentVariable(_keys[i], _values[i]); + } + } +} \ No newline at end of file diff --git a/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdHandlerTests.cs b/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdHandlerTests.cs index c56f7fb..4c59a3f 100644 --- a/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdHandlerTests.cs +++ b/tests/InvestProvider.Backend.Tests/Handlers/AdminCreatePoolzBackIdHandlerTests.cs @@ -15,6 +15,7 @@ using InvestProvider.Backend.Services.Web3.Contracts; using InvestProvider.Backend.Services.Handlers.AdminCreatePoolzBackId; using InvestProvider.Backend.Services.Handlers.AdminCreatePoolzBackId.Models; +using System.Collections.Generic; namespace InvestProvider.Backend.Tests.Handlers; @@ -23,7 +24,11 @@ public class AdminCreatePoolzBackIdHandlerTests [Fact] public async Task Handle_SavesItem_AndReturnsResponse() { - Environment.SetEnvironmentVariable("AWS_REGION", "us-east-1"); + using var _ = EnvironmentVariableScope.Set(new Dictionary + { + ["AWS_REGION"] = "us-east-1", + ["BASE_URL_OF_RPC"] = "http://rpc", + }); var phase = TestHelpers.CreatePhase("1", DateTime.UtcNow, DateTime.UtcNow.AddHours(1), 0m); var projectInfo = TestHelpers.CreateProjectInfo(1, phase); diff --git a/tests/InvestProvider.Backend.Tests/Handlers/GenerateSignatureValidatorTests.cs b/tests/InvestProvider.Backend.Tests/Handlers/GenerateSignatureValidatorTests.cs index 161f191..fcb6708 100644 --- a/tests/InvestProvider.Backend.Tests/Handlers/GenerateSignatureValidatorTests.cs +++ b/tests/InvestProvider.Backend.Tests/Handlers/GenerateSignatureValidatorTests.cs @@ -20,6 +20,7 @@ using poolz.finance.csharp.contracts.InvestProvider.ContractDefinition; using InvestProvider.Backend.Services.Handlers.GenerateSignature; using InvestProvider.Backend.Services.Handlers.GenerateSignature.Models; +using System.Collections.Generic; namespace InvestProvider.Backend.Tests.Handlers; @@ -58,6 +59,8 @@ private static void SetupCommonMocks(Mock> loc [Fact] public async Task Validate_Succeeds_ForWhitelistPhase() { + using var _ = EnvironmentVariableScope.Set("AWS_REGION", "us-east-1"); + var phase = TestHelpers.CreatePhase("1", DateTime.UtcNow, DateTime.UtcNow.AddHours(1), 0m); var projectInfo = TestHelpers.CreateProjectInfo(1, phase); @@ -65,7 +68,6 @@ public async Task Validate_Succeeds_ForWhitelistPhase() strapi.Setup(x => x.ReceiveProjectInfoAsync("pid", It.IsAny())).ReturnsAsync(projectInfo); var dynamoDb = new Mock(); - Environment.SetEnvironmentVariable("AWS_REGION", "us-east-1"); var start = (DateTime)((dynamic)phase).Start; dynamoDb.Setup(x => x.LoadAsync("pid", It.IsAny())) .ReturnsAsync(new ProjectsInformation { ProjectId = "pid", PoolzBackId = 5 }); @@ -87,6 +89,8 @@ public async Task Validate_Succeeds_ForWhitelistPhase() [Fact] public async Task Validate_Throws_WhenAmountLessThanMinimum() { + using var _ = EnvironmentVariableScope.Set("AWS_REGION", "us-east-1"); + var phase = TestHelpers.CreatePhase("1", DateTime.UtcNow, DateTime.UtcNow.AddHours(1), 0m); var projectInfo = TestHelpers.CreateProjectInfo(1, phase); @@ -97,7 +101,6 @@ public async Task Validate_Throws_WhenAmountLessThanMinimum() var start = (DateTime)((dynamic)phase).Start; dynamoDb.Setup(x => x.LoadAsync("pid", It.IsAny())) .ReturnsAsync(new ProjectsInformation { ProjectId = "pid", PoolzBackId = 5 }); - Environment.SetEnvironmentVariable("AWS_REGION", "us-east-1"); dynamoDb.Setup(x => x.LoadAsync(WhiteList.CalculateHashId("pid", start), "0x0000000000000000000000000000000000000123", It.IsAny())) .ReturnsAsync(new WhiteList("pid", start, new EthereumAddress("0x0000000000000000000000000000000000000123"), 10)); diff --git a/tests/InvestProvider.Backend.Tests/Services/SignerManagerTests.cs b/tests/InvestProvider.Backend.Tests/Services/SignerManagerTests.cs index 4277e70..cdf5702 100644 --- a/tests/InvestProvider.Backend.Tests/Services/SignerManagerTests.cs +++ b/tests/InvestProvider.Backend.Tests/Services/SignerManagerTests.cs @@ -1,8 +1,8 @@ -using System; using Moq; using SecretsManager; using Xunit; using InvestProvider.Backend.Services.Web3; +using System.Collections.Generic; namespace InvestProvider.Backend.Tests.Services; @@ -14,8 +14,11 @@ public void GetSigner_ReturnsKey_FromSecretsManager() var secretId = "sid"; var secretKey = "skey"; var privateKey = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - Environment.SetEnvironmentVariable("SECRET_ID_OF_SIGN_ACCOUNT", secretId); - Environment.SetEnvironmentVariable("SECRET_KEY_OF_SIGN_ACCOUNT", secretKey); + using var _ = EnvironmentVariableScope.Set(new Dictionary + { + ["SECRET_ID_OF_SIGN_ACCOUNT"] = secretId, + ["SECRET_KEY_OF_SIGN_ACCOUNT"] = secretKey, + }); var secrets = new Mock(); secrets.Setup(x => x.GetSecretValue(secretId, secretKey)).Returns(privateKey); diff --git a/tests/InvestProvider.Backend.Tests/Services/StrapiClientQueryTests.cs b/tests/InvestProvider.Backend.Tests/Services/StrapiClientQueryTests.cs index 5071bcc..02909b0 100644 --- a/tests/InvestProvider.Backend.Tests/Services/StrapiClientQueryTests.cs +++ b/tests/InvestProvider.Backend.Tests/Services/StrapiClientQueryTests.cs @@ -50,7 +50,7 @@ private static void SetClient(StrapiClient client, GraphQLHttpClient http) [Fact] public async Task ReceiveOnChainInfoAsync_ReturnsInfo() { - Environment.SetEnvironmentVariable("STRAPI_GRAPHQL_URL", "http://localhost"); + using var _ = EnvironmentVariableScope.Set("STRAPI_GRAPHQL_URL", "http://localhost"); var chain = new Chain { @@ -90,7 +90,8 @@ public async Task ReceiveOnChainInfoAsync_ReturnsInfo() [Fact] public async Task ReceiveOnChainInfoAsync_Throws_WhenChainMissing() { - Environment.SetEnvironmentVariable("STRAPI_GRAPHQL_URL", "http://localhost"); + using var _ = EnvironmentVariableScope.Set("STRAPI_GRAPHQL_URL", "http://localhost"); + var gqlResponse = new GraphQLResponse { Data = new OnChainInfoResponse(Array.Empty()) }; var handler = new StubMessageHandler(gqlResponse); var stub = new GraphQLHttpClient(new GraphQLHttpClientOptions { EndPoint = new Uri("http://localhost") }, new NewtonsoftJsonSerializer(), new HttpClient(handler)); @@ -103,7 +104,7 @@ public async Task ReceiveOnChainInfoAsync_Throws_WhenChainMissing() [Fact] public async Task ReceiveProjectInfoAsync_ReturnsInfo() { - Environment.SetEnvironmentVariable("STRAPI_GRAPHQL_URL", "http://localhost"); + using var _ = EnvironmentVariableScope.Set("STRAPI_GRAPHQL_URL", "http://localhost"); var phaseType = Type.GetType("Poolz.Finance.CSharp.Strapi.ComponentPhaseStartEndAmount, Poolz.Finance.CSharp.Strapi")!; var phase = Activator.CreateInstance(phaseType)!; @@ -139,7 +140,8 @@ public async Task ReceiveProjectInfoAsync_ReturnsInfo() [Fact] public async Task ReceiveProjectInfoAsync_Throws_WhenProjectMissing() { - Environment.SetEnvironmentVariable("STRAPI_GRAPHQL_URL", "http://localhost"); + using var _ = EnvironmentVariableScope.Set("STRAPI_GRAPHQL_URL", "http://localhost"); + var gqlResponse = new GraphQLResponse { Data = new ProjectInfoResponse(null!) }; var handler = new StubMessageHandler(gqlResponse); var stub = new GraphQLHttpClient(new GraphQLHttpClientOptions { EndPoint = new Uri("http://localhost") }, new NewtonsoftJsonSerializer(), new HttpClient(handler)); @@ -152,7 +154,7 @@ public async Task ReceiveProjectInfoAsync_Throws_WhenProjectMissing() [Fact] public void SendQuery_Throws_OnGraphQlErrors() { - Environment.SetEnvironmentVariable("STRAPI_GRAPHQL_URL", "http://localhost"); + using var _ = EnvironmentVariableScope.Set("STRAPI_GRAPHQL_URL", "http://localhost"); var errorResp = new GraphQLResponse {