diff --git a/src/EventGridEmulator.Tests/EmulatorValidationTests.cs b/src/EventGridEmulator.Tests/EmulatorValidationTests.cs index a685b2b..caf9d6d 100644 --- a/src/EventGridEmulator.Tests/EmulatorValidationTests.cs +++ b/src/EventGridEmulator.Tests/EmulatorValidationTests.cs @@ -15,7 +15,7 @@ public async Task ValidatePublishAndSubscribeRoundTripForEventGridEvent() { // Define the handler to intercept the message var message = string.Empty; - HttpMessageHandler handler = new TestHandler(requestAction => message = requestAction); + using HttpMessageHandler handler = new TestHandler(requestAction => message = requestAction); // Create the EventGrid subscriber using var subscriber = new FactoryClientBuilder(handler) @@ -47,11 +47,11 @@ public async Task ValidatePublishAndSubscribeRoundTripForEventGridEvent() } [Fact] - public async Task ValidatePublishAndSubscribeRoundTripForCloudEvent() + public async Task ValidatePublishAndSubscribeRoundTripForCloudEventWithEmptySource() { // Define the handler to intercept the message var message = string.Empty; - HttpMessageHandler handler = new TestHandler(requestAction => message = requestAction); + using HttpMessageHandler handler = new TestHandler(requestAction => message = requestAction); // Create the EventGrid subscriber using var subscriber = new FactoryClientBuilder(handler) @@ -63,8 +63,8 @@ public async Task ValidatePublishAndSubscribeRoundTripForCloudEvent() .WithEndpoint(new Uri("https://localhost/orders/api/events")) .Build(); - // Create and send an event to EventGrid - var cloudEvent = new CloudEvent("foo", "bar", new DataModel(some: "data")); + // Create and send an event to EventGrid with an empty source + var cloudEvent = new CloudEvent("", "bar", new DataModel(some: "data")); var response = await publisher.SendEventAsync(cloudEvent); // Assert that the message was successfully sent @@ -73,9 +73,42 @@ public async Task ValidatePublishAndSubscribeRoundTripForCloudEvent() // Assert that the message was successfully received var @event = JsonSerializer.Deserialize(message) ?? throw new NullReferenceException("Message cannot be deserialized"); var result = @event.Single()["data"].Deserialize(); - var receivedTopic = @event.Single()["source"].Deserialize(); + var receivedSource = @event.Single()["source"].Deserialize(); Assert.Equal("data", result?.Some); - Assert.Equal($"{SubscriberConstants.DefaultTopicValue}{ExpectedTopic}", receivedTopic); + Assert.Equal($"{SubscriberConstants.DefaultTopicValue}{ExpectedTopic}", receivedSource); + } + + [Fact] + public async Task ValidatePublishAndSubscribeRoundTripForCloudEventPreserveOriginalSource() + { + // Define the handler to intercept the message + var message = string.Empty; + var originalSource = "SOME_SOURCE_VALUE"; + using HttpMessageHandler handler = new TestHandler(requestAction => message = requestAction); + + // Create the EventGrid subscriber + using var subscriber = new FactoryClientBuilder(handler) + .WithTopic(ExpectedTopic, "https://localhost/orders-webhook") + .Build(); + + // Create the EventGrid publisher + var publisher = new PublisherBuilder(subscriber) + .WithEndpoint(new Uri("https://localhost/orders/api/events")) + .Build(); + + // Create and send an event to EventGrid with a source + var cloudEvent = new CloudEvent(originalSource, "bar", new DataModel(some: "data")); + var response = await publisher.SendEventAsync(cloudEvent); + + // Assert that the message was successfully sent + Assert.Equal(200, response.Status); + + // Assert that the message was successfully received + var @event = JsonSerializer.Deserialize(message) ?? throw new NullReferenceException("Message cannot be deserialized"); + var result = @event.Single()["data"].Deserialize(); + var receivedSource = @event.Single()["source"].Deserialize(); + Assert.Equal("data", result?.Some); + Assert.Equal(originalSource, receivedSource); } private sealed class DataModel diff --git a/src/EventGridEmulator/EventHandling/CloudEventHttpContextHandler.cs b/src/EventGridEmulator/EventHandling/CloudEventHttpContextHandler.cs index 44bef91..c2a4b13 100644 --- a/src/EventGridEmulator/EventHandling/CloudEventHttpContextHandler.cs +++ b/src/EventGridEmulator/EventHandling/CloudEventHttpContextHandler.cs @@ -21,7 +21,10 @@ protected override void EnhanceEventData(IEnumerable cloudEvents, st { foreach (var @event in cloudEvents) { - @event.Source = $"{SubscriberConstants.DefaultTopicValue}{topicName}"; + if (string.IsNullOrEmpty(@event.Source)) + { + @event.Source = $"{SubscriberConstants.DefaultTopicValue}{topicName}"; + } } } } \ No newline at end of file