Skip to content

Commit 5b237e8

Browse files
committed
Update azure integration tests to use AzureServiceBus Administration endpoint for infra creation
1 parent 56f160f commit 5b237e8

2 files changed

Lines changed: 18 additions & 138 deletions

File tree

tests/BuslyCLI.Console.Tests/EndToEnd/AzureServiceBus/AzureServiceBusEndToEndTestBase.cs

Lines changed: 12 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -2,140 +2,29 @@
22

33
namespace BuslyCLI.Console.Tests.EndToEnd.AzureServiceBus;
44

5-
public class AzureServiceBusEndToEndTestBase : EndToEnd.SingletonTestFixtureBase<ServiceBusContainer>
5+
public class AzureServiceBusEndToEndTestBase : SingletonTestFixtureBase<ServiceBusContainer>
66
{
77
protected ServiceBusContainer ServiceBusContainer => Container;
88

9-
protected IList<Tuple<string, string>> GeneratedTestEndpointNamesAndSubscribedEvent =
10-
new List<Tuple<string, string>>();
11-
9+
// GetConnectionString() uses UriBuilder which appends a trailing slash to the endpoint
10+
// (e.g. "sb://localhost:12345/"). NServiceBus's InjectEmulatorAdminPort does a string replace
11+
// looking for "Endpoint=sb://localhost:12345;" (no trailing slash), so it never matches and
12+
// the admin client ends up using the AMQP port instead of port 5300.
13+
// This method builds the connection string without the trailing slash so port injection works correctly.
14+
protected string GetNServiceBusConnectionString()
15+
{
16+
var amqpPort = Container.GetMappedPublicPort(ServiceBusBuilder.ServiceBusPort);
17+
return $"Endpoint=sb://{Container.Hostname}:{amqpPort};SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;";
18+
}
1219

1320
protected override ServiceBusContainer CreateContainer()
1421
{
15-
var azureEmulatorConfigFile = CreateAzureEmulatorConfigFile();
16-
var emulatorConfigFilePath = Path.GetTempFileName();
17-
File.WriteAllText(emulatorConfigFilePath, azureEmulatorConfigFile);
1822
return new ServiceBusBuilder("mcr.microsoft.com/azure-messaging/servicebus-emulator:latest")
1923
.WithAcceptLicenseAgreement(true)
20-
// .WithConfig("./EndToEnd/AzureServiceBus/azure-emulator-config.json")
21-
.WithConfig(emulatorConfigFilePath)
24+
.WithPortBinding(ServiceBusBuilder.ServiceBusHttpPort, ServiceBusBuilder.ServiceBusHttpPort)
2225
.Build();
2326
}
2427

25-
private string CreateAzureEmulatorConfigFile()
26-
{
27-
for (var i = 0; i < 20; i++)
28-
{
29-
GeneratedTestEndpointNamesAndSubscribedEvent.Add(new Tuple<string, string>(
30-
$"TestEndpoint-{Guid.NewGuid():N}", $"MessageContracts.Events.OrderCreated-{Guid.NewGuid():N}"));
31-
}
32-
33-
// Build queue entries as JSON strings
34-
var queueEntries = GeneratedTestEndpointNamesAndSubscribedEvent.Select(endpoint => $@"{{
35-
""Name"": ""{endpoint.Item1}"",
36-
""Properties"": {{
37-
""DeadLetteringOnMessageExpiration"": false,
38-
""DefaultMessageTimeToLive"": ""PT1H"",
39-
""LockDuration"": ""PT1M"",
40-
""MaxDeliveryCount"": 10,
41-
""RequiresDuplicateDetection"": false,
42-
""RequiresSession"": false
43-
}}
44-
}}")
45-
.ToList();
46-
47-
// Join all queue entries into the queues array
48-
string queuesJson = string.Join(",\n", queueEntries);
49-
50-
// Create Subscriptions to the event
51-
var topicEntries = GeneratedTestEndpointNamesAndSubscribedEvent.Select(endpoint => $@"{{
52-
""Name"": ""{endpoint.Item2}"",
53-
""Properties"": {{
54-
""DefaultMessageTimeToLive"": ""PT1H"",
55-
""DuplicateDetectionHistoryTimeWindow"": ""PT20S"",
56-
""RequiresDuplicateDetection"": false
57-
}},
58-
""Subscriptions"": [
59-
{{
60-
""Name"": ""{endpoint.Item1}"",
61-
""Properties"": {{
62-
""DeadLetteringOnMessageExpiration"": false,
63-
""DefaultMessageTimeToLive"": ""PT1H"",
64-
""LockDuration"": ""PT1M"",
65-
""MaxDeliveryCount"": 3,
66-
""ForwardDeadLetteredMessagesTo"": """",
67-
""ForwardTo"": ""{endpoint.Item1}"",
68-
""RequiresSession"": false
69-
}},
70-
""Rules"": [
71-
{{
72-
""Name"": ""$default"",
73-
""Properties"": {{
74-
""FilterType"": ""Sql"",
75-
""SqlFilter"": {{
76-
""SqlExpression"": ""1=1""
77-
}}
78-
}}
79-
}}
80-
]
81-
}}
82-
]
83-
}}")
84-
.ToList();
85-
86-
string topicsJson = string.Join(",\n", topicEntries);
87-
88-
// Final config string
89-
string emulatorConfig = $@"{{
90-
""UserConfig"": {{
91-
""Namespaces"": [
92-
{{
93-
""Name"": ""sbemulatorns"",
94-
""Queues"": [
95-
{queuesJson}
96-
],
97-
""Topics"": [
98-
{topicsJson}
99-
]
100-
}}
101-
],
102-
""Logging"": {{
103-
""Type"": ""File""
104-
}}
105-
}}
106-
}}";
107-
// string emulatorConfig = $@"{{
108-
// ""UserConfig"": {{
109-
// ""Namespaces"": [
110-
// {{
111-
// ""Name"": ""sbemulatorns"",
112-
// ""Queues"": [
113-
// {queuesJson}
114-
// ],
115-
// ""Topics"": [
116-
// {{
117-
// ""Name"": ""MessageContracts.Events.OrderCreated"",
118-
// ""Properties"": {{
119-
// ""DefaultMessageTimeToLive"": ""PT1H"",
120-
// ""DuplicateDetectionHistoryTimeWindow"": ""PT20S"",
121-
// ""RequiresDuplicateDetection"": false
122-
// }},
123-
// ""Subscriptions"": [
124-
// {subscriptionsJson}
125-
// ]
126-
// }}
127-
// ]
128-
// }}
129-
// ],
130-
// ""Logging"": {{
131-
// ""Type"": ""File""
132-
// }}
133-
// }}
134-
// }}";
135-
136-
return emulatorConfig;
137-
}
138-
13928
protected override async Task StartContainerAsync(ServiceBusContainer container)
14029
{
14130
await container.StartAsync();

tests/BuslyCLI.Console.Tests/EndToEnd/AzureServiceBus/SendCommandAzureServiceBusEndToEndTests.cs

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -69,25 +69,17 @@ await RunWithTestEndpoint(async testEndpoint =>
6969
}
7070

7171
[Test]
72-
// TODO: Remove endpoint.Subscribe("<<EVENT>>") calls
73-
// TODO: in `HostSettings` pass `false` for the setupInfrastructure parameter
74-
// TODO: [Option 1 - NOT EASY] Find a way so that i can "pre-determine" the number of test methods
75-
// to pregenerate a list of queues, subscriptions, and topics
76-
// TODO: [Option 2 - precreate a list of events and random endpoint names. pull the names from the list during execution so it can't be used by another test]
77-
// TODO: [Option 3 - create and destroy a container per test. This would be slow and possibly a resource hog if done in paralle]
7872
public async Task ShouldPublishEvent()
7973
{
8074
await RunWithTestEndpoint(async testEndpoint =>
8175
{
8276
// Arrange
8377
await testEndpoint.StartEndpoint();
84-
// This wont work. Emulator doesn't allow subscription creation. It's all pre-setup with emulator config
85-
// await testEndpoint.Subscribe("MessageContracts.Events.OrderCreated");
78+
var eventType = $"MessageContracts.Events.OrderCreated-{Guid.NewGuid():N}";
79+
await testEndpoint.Subscribe(eventType);
8680
var messageBody = new { OrderNumber = Guid.NewGuid() };
8781

8882
var json = JsonSerializer.Serialize(messageBody, _jsonObjectOptions);
89-
var eventType = GeneratedTestEndpointNamesAndSubscribedEvent
90-
.Single(x => x.Item1 == testEndpoint.EndpointName).Item2;
9183

9284
var yamlFile = $"""
9385
---
@@ -120,15 +112,14 @@ await RunWithTestEndpoint(async testEndpoint =>
120112

121113
private async Task RunWithTestEndpoint(Func<RawEndpoint, Task> testAction)
122114
{
123-
var random = new Random();
124-
var testEndpointName = GeneratedTestEndpointNamesAndSubscribedEvent[random.Next(GeneratedTestEndpointNamesAndSubscribedEvent.Count)];
125-
var testEndpoint = await new RawEndpointFactory().CreateRawEndpoint(testEndpointName.Item1, new TransportConfig()
115+
var testEndpointName = $"TestEndpoint-{Guid.NewGuid():N}";
116+
var testEndpoint = await new RawEndpointFactory().CreateRawEndpoint(testEndpointName, new TransportConfig()
126117
{
127118
AzureServiceBusTransportConfig = new AzureServiceBusTransportConfig()
128119
{
129-
ConnectionString = Container.GetConnectionString()
120+
ConnectionString = GetNServiceBusConnectionString()
130121
}
131-
}, false);
122+
}, true);
132123

133124
await testAction(testEndpoint);
134125
await testEndpoint.ShutDownAndCleanUp();

0 commit comments

Comments
 (0)