Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
victorjonsson committed Sep 2, 2019
1 parent ed71631 commit 3e4b6dc
Show file tree
Hide file tree
Showing 2 changed files with 153 additions and 0 deletions.
22 changes: 22 additions & 0 deletions test/Test.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="2.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.0.1" />
<PackageReference Include="Moq" Version="4.9.0" />
<PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.1" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\src\AzureKeyVaultConfigProvider.csproj" />
</ItemGroup>

</Project>
131 changes: 131 additions & 0 deletions test/TestAzureKeyVaultConfigProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
using Microsoft.Azure.KeyVault.Models;
using Microsoft.Extensions.Configuration;
using Moq;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;

namespace VikJon.AzureKeyVaultConfigProvider
{
public class TestAzureKeyVaultConfigProvider
{
private const string NameOfConfigHavingSecret = "ConfigWithSecret";
private const string SecretName = "SecretName";
private const string SecretValue = "SomeSuperSecretValue";
private const string KeyVaultUrl = "https://azurekeyvault.com";

[Fact]
public void test_that_we_dont_crasch_when_feature_isnt_used()
{
var configBuilder = new ConfigurationBuilder();
configBuilder.AddInMemoryCollection(new Dictionary<string, string>() {
{"Something", "HasValue"}
});
configBuilder.AddAzureKeyVaultWithNameRefSupport();
configBuilder.Build();
}

[Fact]
public void test_that_we_get_expected_exception_when_key_vault_url_is_missing()
{
var configBuilder = new ConfigurationBuilder();
configBuilder.AddInMemoryCollection(new Dictionary<string, string>() {
{NameOfConfigHavingSecret, GetKeyVaultRefMissingVaultUrl()}
});
configBuilder.AddAzureKeyVaultWithNameRefSupport();
Assert.Throws<InvalidConfigException>(() => configBuilder.Build());
}

[Fact]
public void test_that_we_can_fetch_secret_from_key_vault()
{
var keyVaultGateway = new Mock<IKeyVaultGateway>();
var secretBundle = new SecretBundle() { Value = SecretValue };
keyVaultGateway
.Setup(m => m.GetSecretAsync(SecretName, KeyVaultUrl))
.Returns(Task.FromResult(secretBundle));

var configBuilder = new ConfigurationBuilder();
configBuilder.AddInMemoryCollection(GetConfig(GetKeyVaultRef()));
configBuilder.AddAzureKeyVaultWithNameRefSupport(null, keyVaultGateway.Object);
var config = configBuilder.Build();
Assert.Equal(SecretValue, config[NameOfConfigHavingSecret]?.ToString());
}

[Fact]
public void test_that_we_can_fetch_secret_having_keyvault_url_present_in_config()
{
var keyVaultGateway = new Mock<IKeyVaultGateway>();
var secretBundle = new SecretBundle() { Value = SecretValue };
keyVaultGateway
.Setup(m => m.GetSecretAsync(SecretName, "https://somekeyvaulthere.com"))
.Returns(Task.FromResult(secretBundle));

var config = GetConfig(GetKeyVaultRefMissingVaultUrl());
config.Add("AZURE_KEY_VAULT_URL", "https://somekeyvaulthere.com");
var configBuilder = new ConfigurationBuilder();
configBuilder.AddInMemoryCollection(config);
configBuilder.AddAzureKeyVaultWithNameRefSupport(null, keyVaultGateway.Object);
var newConfig = configBuilder.Build();
Assert.Equal(SecretValue, newConfig[NameOfConfigHavingSecret]?.ToString());
}

[Fact]
public void test_that_we_can_fetch_secret_having_keyvault_url_provided_through_code()
{
var keyVaultUrl = "https://somekeyvaulthere.com";
var keyVaultGateway = new Mock<IKeyVaultGateway>();
var secretBundle = new SecretBundle() { Value = SecretValue };
keyVaultGateway
.Setup(m => m.GetSecretAsync(SecretName, "https://somekeyvaulthere.com"))
.Returns(Task.FromResult(secretBundle));

var config = GetConfig(GetKeyVaultRefMissingVaultUrl());
var configBuilder = new ConfigurationBuilder();
configBuilder.AddInMemoryCollection(config);
configBuilder.AddAzureKeyVaultWithNameRefSupport(keyVaultUrl, keyVaultGateway.Object);
var newConfig = configBuilder.Build();
Assert.Equal(SecretValue, newConfig[NameOfConfigHavingSecret]?.ToString());
}

[Fact]
public void test_that_we_can_fetch_multiple_secrets()
{
var keyVaultGateway = new Mock<IKeyVaultGateway>();
keyVaultGateway
.Setup(m => m.GetSecretAsync(SecretName, KeyVaultUrl))
.Returns(Task.FromResult(new SecretBundle() { Value = SecretValue }));
keyVaultGateway
.Setup(m => m.GetSecretAsync("anotherSecret", KeyVaultUrl))
.Returns(Task.FromResult(new SecretBundle() { Value = "anotherSecretValue" }));

var config = GetConfig(GetKeyVaultRef());
config.Add("AnotherConfigWithSecret", GetKeyVaultRef(nameOfSecret: "anotherSecret"));
var configBuilder = new ConfigurationBuilder();
configBuilder.AddInMemoryCollection(config);
configBuilder.AddAzureKeyVaultWithNameRefSupport(null, keyVaultGateway.Object);
var newConfig = configBuilder.Build();
Assert.Equal(SecretValue, newConfig[NameOfConfigHavingSecret]?.ToString());
Assert.Equal("anotherSecretValue", newConfig["AnotherConfigWithSecret"]?.ToString());
}

private static Dictionary<string, string> GetConfig(string keyVaultRef)
{
return new Dictionary<string, string>() {
{"Something", "HasValue"},
{"Something:else", "HasOtherValue"},
{NameOfConfigHavingSecret, keyVaultRef}
};
}

private static string GetKeyVaultRefMissingVaultUrl()
{
return "@AzureKeyVault(" + SecretName + ")";
}

private static string GetKeyVaultRef(string nameOfSecret = SecretName, string keyVaultUrl = KeyVaultUrl)
{
return "@AzureKeyVault(" + nameOfSecret + ", " + keyVaultUrl + ")";
}
}
}

0 comments on commit 3e4b6dc

Please sign in to comment.