Skip to content

Commit 8db18c1

Browse files
authored
Add multiple keyed services tests (dotnet#3896)
Follow up from dotnet#3873 Adding these tests found dotnet#3890 which isn't being fixed in this change.
1 parent a72957f commit 8db18c1

File tree

21 files changed

+626
-22
lines changed

21 files changed

+626
-22
lines changed

tests/Aspire.Azure.AI.OpenAI.Tests/AspireAzureAIOpenAIExtensionsTests.cs

+25
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,29 @@ public void ReadsFromConnectionStringsFormats(string connectionString)
8686
Assert.NotNull(client);
8787
}
8888

89+
[Fact]
90+
public void CanAddMultipleKeyedServices()
91+
{
92+
var builder = Host.CreateEmptyApplicationBuilder(null);
93+
builder.Configuration.AddInMemoryCollection([
94+
new KeyValuePair<string, string?>("ConnectionStrings:openai1", ConnectionString),
95+
new KeyValuePair<string, string?>("ConnectionStrings:openai2", ConnectionString + "2"),
96+
new KeyValuePair<string, string?>("ConnectionStrings:openai3", ConnectionString + "3")
97+
]);
98+
99+
builder.AddAzureOpenAIClient("openai1");
100+
builder.AddKeyedAzureOpenAIClient("openai2");
101+
builder.AddKeyedAzureOpenAIClient("openai3");
102+
103+
using var host = builder.Build();
104+
105+
// Unkeyed services don't work with keyed services. See https://github.com/dotnet/aspire/issues/3890
106+
//var client1 = host.Services.GetRequiredService<OpenAIClient>();
107+
var client2 = host.Services.GetRequiredKeyedService<OpenAIClient>("openai2");
108+
var client3 = host.Services.GetRequiredKeyedService<OpenAIClient>("openai3");
109+
110+
//Assert.NotSame(client1, client2);
111+
//Assert.NotSame(client1, client3);
112+
Assert.NotSame(client2, client3);
113+
}
89114
}

tests/Aspire.Azure.Data.Tables.Tests/AspireTablesExtensionsTests.cs

+30
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,34 @@ public void ServiceUriWorksInConnectionStrings(bool useKeyed)
124124

125125
Assert.Equal("aspirestoragetests", client.AccountName);
126126
}
127+
128+
[Fact]
129+
public void CanAddMultipleKeyedServices()
130+
{
131+
var builder = Host.CreateEmptyApplicationBuilder(null);
132+
builder.Configuration.AddInMemoryCollection([
133+
new KeyValuePair<string, string?>("ConnectionStrings:tables1", ConnectionString),
134+
new KeyValuePair<string, string?>("ConnectionStrings:tables2", "AccountName=account2;AccountKey=fake"),
135+
new KeyValuePair<string, string?>("ConnectionStrings:tables3", "AccountName=account3;AccountKey=fake")
136+
]);
137+
138+
builder.AddAzureTableClient("tables1");
139+
builder.AddKeyedAzureTableClient("tables2");
140+
builder.AddKeyedAzureTableClient("tables3");
141+
142+
using var host = builder.Build();
143+
144+
// Unkeyed services don't work with keyed services. See https://github.com/dotnet/aspire/issues/3890
145+
//var client1 = host.Services.GetRequiredService<TableServiceClient>();
146+
var client2 = host.Services.GetRequiredKeyedService<TableServiceClient>("tables2");
147+
var client3 = host.Services.GetRequiredKeyedService<TableServiceClient>("tables3");
148+
149+
//Assert.NotSame(client1, client2);
150+
//Assert.NotSame(client1, client3);
151+
Assert.NotSame(client2, client3);
152+
153+
//Assert.Equal("aspirestoragetests", client1.AccountName);
154+
Assert.Equal("account2", client2.AccountName);
155+
Assert.Equal("account3", client3.AccountName);
156+
}
127157
}

tests/Aspire.Azure.Messaging.EventHubs.Tests/AspireEventHubsExtensionsTests.cs

+51-7
Original file line numberDiff line numberDiff line change
@@ -247,23 +247,23 @@ public void ConnectionNameWinsOverConfigSection(bool useKeyed, int clientIndex)
247247

248248
private static void RetrieveAndAssert(bool useKeyed, int clientIndex, IHost host)
249249
{
250-
var client = RetrieveClient(useKeyed, clientIndex, host);
250+
var client = RetrieveClient(useKeyed ? "eh" : null, clientIndex, host);
251251

252-
AssertFullyQualifiedNamespace(client);
252+
AssertFullyQualifiedNamespace(FullyQualifiedNamespace, client);
253253
}
254254

255-
private static object RetrieveClient(bool useKeyed, int clientIndex, IHost host)
255+
private static object RetrieveClient(object? key, int clientIndex, IHost host)
256256
{
257-
var client = useKeyed ?
258-
host.Services.GetRequiredKeyedService(s_clientTypes[clientIndex], "eh") :
257+
var client = key is not null ?
258+
host.Services.GetRequiredKeyedService(s_clientTypes[clientIndex], key) :
259259
host.Services.GetRequiredService(s_clientTypes[clientIndex]);
260260

261261
return client;
262262
}
263263

264-
private static void AssertFullyQualifiedNamespace(object client)
264+
private static void AssertFullyQualifiedNamespace(string expectedNamespace, object client)
265265
{
266-
Assert.Equal(FullyQualifiedNamespace, client switch
266+
Assert.Equal(expectedNamespace, client switch
267267
{
268268
EventHubProducerClient producer => producer.FullyQualifiedNamespace,
269269
EventHubConsumerClient consumer => consumer.FullyQualifiedNamespace,
@@ -324,6 +324,50 @@ public void NamespaceWorksInConnectionStrings(bool useKeyed, int clientIndex)
324324
RetrieveAndAssert(useKeyed, clientIndex, host);
325325
}
326326

327+
[Theory]
328+
[InlineData(EventHubProducerClientIndex)]
329+
[InlineData(EventHubConsumerClientIndex)]
330+
[InlineData(EventProcessorClientIndex)]
331+
[InlineData(PartitionReceiverIndex)]
332+
public void CanAddMultipleKeyedServices(int clientIndex)
333+
{
334+
var builder = Host.CreateEmptyApplicationBuilder(null);
335+
builder.Configuration.AddInMemoryCollection([
336+
new KeyValuePair<string, string?>("ConnectionStrings:eh1", EhConnectionString),
337+
new KeyValuePair<string, string?>($"Aspire:Azure:Messaging:EventHubs:{s_clientTypes[clientIndex].Name}:BlobContainerName", "checkpoints"),
338+
new KeyValuePair<string, string?>($"Aspire:Azure:Messaging:EventHubs:{s_clientTypes[clientIndex].Name}:PartitionId", "foo"),
339+
340+
new KeyValuePair<string, string?>("ConnectionStrings:eh2", EhConnectionString.Replace("aspireeventhubstests", "aspireeventhubstests2")),
341+
new KeyValuePair<string, string?>($"Aspire:Azure:Messaging:EventHubs:{s_clientTypes[clientIndex].Name}:eh2:BlobContainerName", "checkpoints"),
342+
new KeyValuePair<string, string?>($"Aspire:Azure:Messaging:EventHubs:{s_clientTypes[clientIndex].Name}:eh2:PartitionId", "foo"),
343+
344+
new KeyValuePair<string, string?>("ConnectionStrings:eh3", EhConnectionString.Replace("aspireeventhubstests", "aspireeventhubstests3")),
345+
new KeyValuePair<string, string?>($"Aspire:Azure:Messaging:EventHubs:{s_clientTypes[clientIndex].Name}:eh3:BlobContainerName", "checkpoints"),
346+
new KeyValuePair<string, string?>($"Aspire:Azure:Messaging:EventHubs:{s_clientTypes[clientIndex].Name}:eh3:PartitionId", "foo"),
347+
]);
348+
349+
ConfigureBlobServiceClient(useKeyed: false, builder.Services);
350+
351+
s_clientAdders[clientIndex](builder, "eh1", null);
352+
s_keyedClientAdders[clientIndex](builder, "eh2", null);
353+
s_keyedClientAdders[clientIndex](builder, "eh3", null);
354+
355+
using var host = builder.Build();
356+
357+
// Unkeyed services don't work with keyed services. See https://github.com/dotnet/aspire/issues/3890
358+
//var client1 = RetrieveClient(key: null, clientIndex, host);
359+
var client2 = RetrieveClient(key: "eh2", clientIndex, host);
360+
var client3 = RetrieveClient(key: "eh3", clientIndex, host);
361+
362+
//Assert.NotSame(client1, client2);
363+
//Assert.NotSame(client1, client3);
364+
Assert.NotSame(client2, client3);
365+
366+
//AssertFullyQualifiedNamespace("aspireeventhubstests.servicebus.windows.net", client1);
367+
AssertFullyQualifiedNamespace("aspireeventhubstests2.servicebus.windows.net", client2);
368+
AssertFullyQualifiedNamespace("aspireeventhubstests3.servicebus.windows.net", client3);
369+
}
370+
327371
public static string CreateConfigKey(string prefix, string? key, string suffix)
328372
=> string.IsNullOrEmpty(key) ? $"{prefix}:{suffix}" : $"{prefix}:{key}:{suffix}";
329373
}

tests/Aspire.Azure.Messaging.ServiceBus.Tests/AspireServiceBusExtensionsTests.cs

+30
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,34 @@ public void NamespaceWorksInConnectionStrings(bool useKeyed)
124124

125125
Assert.Equal(ConformanceTests.FullyQualifiedNamespace, client.FullyQualifiedNamespace);
126126
}
127+
128+
[Fact]
129+
public void CanAddMultipleKeyedServices()
130+
{
131+
var builder = Host.CreateEmptyApplicationBuilder(null);
132+
builder.Configuration.AddInMemoryCollection([
133+
new KeyValuePair<string, string?>("ConnectionStrings:sb1", ConnectionString),
134+
new KeyValuePair<string, string?>("ConnectionStrings:sb2", "Endpoint=sb://aspireservicebustests2.servicebus.windows.net/;SharedAccessKeyName=fake;SharedAccessKey=fake"),
135+
new KeyValuePair<string, string?>("ConnectionStrings:sb3", "Endpoint=sb://aspireservicebustests3.servicebus.windows.net/;SharedAccessKeyName=fake;SharedAccessKey=fake")
136+
]);
137+
138+
builder.AddAzureServiceBusClient("sb1");
139+
builder.AddKeyedAzureServiceBusClient("sb2");
140+
builder.AddKeyedAzureServiceBusClient("sb3");
141+
142+
using var host = builder.Build();
143+
144+
// Unkeyed services don't work with keyed services. See https://github.com/dotnet/aspire/issues/3890
145+
//var client1 = host.Services.GetRequiredService<ServiceBusClient>();
146+
var client2 = host.Services.GetRequiredKeyedService<ServiceBusClient>("sb2");
147+
var client3 = host.Services.GetRequiredKeyedService<ServiceBusClient>("sb3");
148+
149+
//Assert.NotSame(client1, client2);
150+
//Assert.NotSame(client1, client3);
151+
Assert.NotSame(client2, client3);
152+
153+
//Assert.Equal(ConformanceTests.FullyQualifiedNamespace, client1.FullyQualifiedNamespace);
154+
Assert.Equal("aspireservicebustests2.servicebus.windows.net", client2.FullyQualifiedNamespace);
155+
Assert.Equal("aspireservicebustests3.servicebus.windows.net", client3.FullyQualifiedNamespace);
156+
}
127157
}

tests/Aspire.Azure.Search.Documents.Tests/AspireAzureSearchExtensionsTests.cs

+30
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,34 @@ public void ConnectionStringCanBeSetInCode(bool useKeyed)
6868
Assert.NotNull(client);
6969
Assert.Equal(new Uri(SearchEndpoint), client.Endpoint);
7070
}
71+
72+
[Fact]
73+
public void CanAddMultipleKeyedServices()
74+
{
75+
var builder = Host.CreateEmptyApplicationBuilder(null);
76+
builder.Configuration.AddInMemoryCollection([
77+
new KeyValuePair<string, string?>("ConnectionStrings:search1", ConnectionString),
78+
new KeyValuePair<string, string?>("ConnectionStrings:search2", "Endpoint=https://aspireazuresearchtests2.search.windows.net/;Key=fake"),
79+
new KeyValuePair<string, string?>("ConnectionStrings:search3", "Endpoint=https://aspireazuresearchtests3.search.windows.net/;Key=fake")
80+
]);
81+
82+
builder.AddAzureSearchClient("search1");
83+
builder.AddKeyedAzureSearchClient("search2");
84+
builder.AddKeyedAzureSearchClient("search3");
85+
86+
using var host = builder.Build();
87+
88+
// Unkeyed services don't work with keyed services. See https://github.com/dotnet/aspire/issues/3890
89+
//var client1 = host.Services.GetRequiredService<SearchIndexClient>();
90+
var client2 = host.Services.GetRequiredKeyedService<SearchIndexClient>("search2");
91+
var client3 = host.Services.GetRequiredKeyedService<SearchIndexClient>("search3");
92+
93+
//Assert.NotSame(client1, client2);
94+
//Assert.NotSame(client1, client3);
95+
Assert.NotSame(client2, client3);
96+
97+
//Assert.Equal(new Uri(SearchEndpoint), client1.Endpoint);
98+
Assert.Equal(new Uri("https://aspireazuresearchtests2.search.windows.net/"), client2.Endpoint);
99+
Assert.Equal(new Uri("https://aspireazuresearchtests3.search.windows.net/"), client3.Endpoint);
100+
}
71101
}

tests/Aspire.Azure.Security.KeyVault.Tests/AspireKeyVaultExtensionsTests.cs

+30
Original file line numberDiff line numberDiff line change
@@ -171,4 +171,34 @@ private static MockResponse CreateResponse(string content)
171171

172172
return response;
173173
}
174+
175+
[Fact]
176+
public void CanAddMultipleKeyedServices()
177+
{
178+
var builder = Host.CreateEmptyApplicationBuilder(null);
179+
builder.Configuration.AddInMemoryCollection([
180+
new KeyValuePair<string, string?>("ConnectionStrings:secrets1", ConformanceTests.VaultUri),
181+
new KeyValuePair<string, string?>("ConnectionStrings:secrets2", "https://aspiretests2.vault.azure.net/"),
182+
new KeyValuePair<string, string?>("ConnectionStrings:secrets3", "https://aspiretests3.vault.azure.net/")
183+
]);
184+
185+
builder.AddAzureKeyVaultClient("secrets1");
186+
builder.AddKeyedAzureKeyVaultClient("secrets2");
187+
builder.AddKeyedAzureKeyVaultClient("secrets3");
188+
189+
using var host = builder.Build();
190+
191+
// Unkeyed services don't work with keyed services. See https://github.com/dotnet/aspire/issues/3890
192+
//var client1 = host.Services.GetRequiredService<SecretClient>();
193+
var client2 = host.Services.GetRequiredKeyedService<SecretClient>("secrets2");
194+
var client3 = host.Services.GetRequiredKeyedService<SecretClient>("secrets3");
195+
196+
//Assert.NotSame(client1, client2);
197+
//Assert.NotSame(client1, client3);
198+
Assert.NotSame(client2, client3);
199+
200+
//Assert.Equal(new Uri(ConformanceTests.VaultUri), client1.VaultUri);
201+
Assert.Equal(new Uri("https://aspiretests2.vault.azure.net/"), client2.VaultUri);
202+
Assert.Equal(new Uri("https://aspiretests3.vault.azure.net/"), client3.VaultUri);
203+
}
174204
}

tests/Aspire.Azure.Storage.Blobs.Tests/AspireBlobStorageExtensionsTests.cs

+30
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,34 @@ public void ServiceUriWorksInConnectionStrings(bool useKeyed)
124124

125125
Assert.Equal("aspirestoragetests", client.AccountName);
126126
}
127+
128+
[Fact]
129+
public void CanAddMultipleKeyedServices()
130+
{
131+
var builder = Host.CreateEmptyApplicationBuilder(null);
132+
builder.Configuration.AddInMemoryCollection([
133+
new KeyValuePair<string, string?>("ConnectionStrings:blob1", ConformanceTests.ServiceUri),
134+
new KeyValuePair<string, string?>("ConnectionStrings:blob2", "https://aspirestoragetests2.blob.core.windows.net/"),
135+
new KeyValuePair<string, string?>("ConnectionStrings:blob3", "https://aspirestoragetests3.blob.core.windows.net/")
136+
]);
137+
138+
builder.AddAzureBlobClient("blob1");
139+
builder.AddKeyedAzureBlobClient("blob2");
140+
builder.AddKeyedAzureBlobClient("blob3");
141+
142+
using var host = builder.Build();
143+
144+
// Unkeyed services don't work with keyed services. See https://github.com/dotnet/aspire/issues/3890
145+
//var client1 = host.Services.GetRequiredService<BlobServiceClient>();
146+
var client2 = host.Services.GetRequiredKeyedService<BlobServiceClient>("blob2");
147+
var client3 = host.Services.GetRequiredKeyedService<BlobServiceClient>("blob3");
148+
149+
//Assert.NotSame(client1, client2);
150+
//Assert.NotSame(client1, client3);
151+
Assert.NotSame(client2, client3);
152+
153+
//Assert.Equal("aspirestoragetests", client1.AccountName);
154+
Assert.Equal("aspirestoragetests2", client2.AccountName);
155+
Assert.Equal("aspirestoragetests3", client3.AccountName);
156+
}
127157
}

tests/Aspire.Azure.Storage.Queues.Tests/AspireQueueStorageExtensionsTests.cs

+30
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,34 @@ public void ServiceUriWorksInConnectionStrings(bool useKeyed)
124124

125125
Assert.Equal("aspirestoragetests", client.AccountName);
126126
}
127+
128+
[Fact]
129+
public void CanAddMultipleKeyedServices()
130+
{
131+
var builder = Host.CreateEmptyApplicationBuilder(null);
132+
builder.Configuration.AddInMemoryCollection([
133+
new KeyValuePair<string, string?>("ConnectionStrings:queue1", ConformanceTests.ServiceUri),
134+
new KeyValuePair<string, string?>("ConnectionStrings:queue2", "https://aspirestoragetests2.queue.core.windows.net"),
135+
new KeyValuePair<string, string?>("ConnectionStrings:queue3", "https://aspirestoragetests3.queue.core.windows.net")
136+
]);
137+
138+
builder.AddAzureQueueClient("queue1");
139+
builder.AddKeyedAzureQueueClient("queue2");
140+
builder.AddKeyedAzureQueueClient("queue3");
141+
142+
using var host = builder.Build();
143+
144+
// Unkeyed services don't work with keyed services. See https://github.com/dotnet/aspire/issues/3890
145+
//var client1 = host.Services.GetRequiredService<QueueServiceClient>();
146+
var client2 = host.Services.GetRequiredKeyedService<QueueServiceClient>("queue2");
147+
var client3 = host.Services.GetRequiredKeyedService<QueueServiceClient>("queue3");
148+
149+
//Assert.NotSame(client1, client2);
150+
//Assert.NotSame(client1, client3);
151+
Assert.NotSame(client2, client3);
152+
153+
//Assert.Equal("aspirestoragetests", client1.AccountName);
154+
Assert.Equal("aspirestoragetests2", client2.AccountName);
155+
Assert.Equal("aspirestoragetests3", client3.AccountName);
156+
}
127157
}

tests/Aspire.Confluent.Kafka.Tests/ConsumerConformanceTests.cs

+31
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.Extensions.Configuration;
77
using Microsoft.Extensions.DependencyInjection;
88
using Microsoft.Extensions.Hosting;
9+
using Xunit;
910

1011
namespace Aspire.Confluent.Kafka.Tests;
1112
public class ConsumerConformanceTests : ConformanceTests<IConsumer<string, string>, KafkaConsumerSettings>
@@ -81,4 +82,34 @@ protected override (string json, string error)[] InvalidJsonToErrorMessage => ne
8182
("""{"Aspire": { "Confluent":{ "Kafka": { "Consumer": { "DisableMetrics": 0}}}}}""", "Value is \"integer\" but should be \"boolean\""),
8283
("""{"Aspire": { "Confluent":{ "Kafka": { "Consumer": { "DisableHealthChecks": 0}}}}}""", "Value is \"integer\" but should be \"boolean\"")
8384
};
85+
86+
[Fact]
87+
public void CanAddMultipleKeyedServices()
88+
{
89+
var builder = Host.CreateEmptyApplicationBuilder(null);
90+
builder.Configuration.AddInMemoryCollection([
91+
new KeyValuePair<string, string?>("ConnectionStrings:messaging1", "localhost:9091"),
92+
new KeyValuePair<string, string?>("Aspire:Confluent:Kafka:Consumer:Config:GroupId", "messaging1"),
93+
94+
new KeyValuePair<string, string?>("ConnectionStrings:messaging2", "localhost:9092"),
95+
new KeyValuePair<string, string?>("Aspire:Confluent:Kafka:Consumer:messaging2:Config:GroupId", "messaging2"),
96+
97+
new KeyValuePair<string, string?>("ConnectionStrings:messaging3", "localhost:9093"),
98+
new KeyValuePair<string, string?>("Aspire:Confluent:Kafka:Consumer:messaging3:Config:GroupId", "messaging3"),
99+
]);
100+
101+
builder.AddKafkaConsumer<string, string>("messaging1");
102+
builder.AddKeyedKafkaConsumer<string, string>("messaging2");
103+
builder.AddKeyedKafkaConsumer<string, string>("messaging3");
104+
105+
using var host = builder.Build();
106+
107+
var client1 = host.Services.GetRequiredService<IConsumer<string, string>>();
108+
var client2 = host.Services.GetRequiredKeyedService<IConsumer<string, string>>("messaging2");
109+
var client3 = host.Services.GetRequiredKeyedService<IConsumer<string, string>>("messaging3");
110+
111+
Assert.NotSame(client1, client2);
112+
Assert.NotSame(client1, client3);
113+
Assert.NotSame(client2, client3);
114+
}
84115
}

0 commit comments

Comments
 (0)