diff --git a/.autover/changes/01370ae5-3537-4723-80b3-ee82e79e80b9.json b/.autover/changes/01370ae5-3537-4723-80b3-ee82e79e80b9.json new file mode 100644 index 00000000..650908a1 --- /dev/null +++ b/.autover/changes/01370ae5-3537-4723-80b3-ee82e79e80b9.json @@ -0,0 +1,11 @@ +{ + "Projects": [ + { + "Name": "AWS.Messaging", + "Type": "Patch", + "ChangelogMessages": [ + "Update error message for handling scenario where subscriber mapping is not valid." + ] + } + ] +} \ No newline at end of file diff --git a/src/AWS.Messaging/Serialization/EnvelopeSerializer.cs b/src/AWS.Messaging/Serialization/EnvelopeSerializer.cs index ddc304d2..871c4288 100644 --- a/src/AWS.Messaging/Serialization/EnvelopeSerializer.cs +++ b/src/AWS.Messaging/Serialization/EnvelopeSerializer.cs @@ -144,8 +144,14 @@ public async ValueTask ConvertToEnvelopeAsync(Message s var subscriberMapping = _messageConfiguration.GetSubscriberMapping(messageTypeIdentifier); if (subscriberMapping is null) { - _logger.LogError("{MessageConfiguration} does not have a valid subscriber mapping for message ID '{MessageTypeIdentifier}'", nameof(_messageConfiguration), messageTypeIdentifier); - throw new InvalidDataException($"{nameof(_messageConfiguration)} does not have a valid subscriber mapping for {nameof(messageTypeIdentifier)} '{messageTypeIdentifier}'"); + var availableMappings = string.Join(", ", _messageConfiguration.SubscriberMappings.Select(m => m.MessageTypeIdentifier)); + _logger.LogError("'{MessageTypeIdentifier}' is not a valid subscriber mapping. Available mappings: {AvailableMappings}", + messageTypeIdentifier, + string.IsNullOrEmpty(availableMappings) ? "none" : availableMappings); + + throw new InvalidDataException( + $"'{messageTypeIdentifier}' is not a valid subscriber mapping. " + + $"Available mappings: {(string.IsNullOrEmpty(availableMappings) ? "none" : availableMappings)}"); } var messageType = subscriberMapping.MessageType; diff --git a/test/AWS.Messaging.IntegrationTests/FifoSubscriberTests.cs b/test/AWS.Messaging.IntegrationTests/FifoSubscriberTests.cs index 0351bec9..cfa4f4fc 100644 --- a/test/AWS.Messaging.IntegrationTests/FifoSubscriberTests.cs +++ b/test/AWS.Messaging.IntegrationTests/FifoSubscriberTests.cs @@ -162,7 +162,7 @@ public async Task MessagesWithoutHandlers(int numberOfMessages) var timeElapsed = DateTime.UtcNow - processStartTime; var inMemoryLogger = serviceProvider.GetRequiredService(); - var errorMessages = inMemoryLogger.Logs.Where(x => x.Message.Equals("_messageConfiguration does not have a valid subscriber mapping for message ID 'AWS.Messaging.Tests.Common.Models.TransactionInfo'")); + var errorMessages = inMemoryLogger.Logs.Where(x => x.Message.StartsWith("'") && x.Message.Contains("is not a valid subscriber mapping")); Assert.NotEmpty(errorMessages); Assert.True(errorMessages.Count() >= numberOfMessages); Assert.True(timeElapsed.TotalSeconds > 29); diff --git a/test/AWS.Messaging.IntegrationTests/SubscriberTests.cs b/test/AWS.Messaging.IntegrationTests/SubscriberTests.cs index f62bc670..2982c048 100644 --- a/test/AWS.Messaging.IntegrationTests/SubscriberTests.cs +++ b/test/AWS.Messaging.IntegrationTests/SubscriberTests.cs @@ -316,7 +316,7 @@ await publisher.PublishAsync(new ChatMessage var timeElapsed = DateTime.UtcNow - processStartTime; var inMemoryLogger = serviceProvider.GetRequiredService(); - var errorMessages = inMemoryLogger.Logs.Where(x => x.Message.Equals("_messageConfiguration does not have a valid subscriber mapping for message ID 'AWS.Messaging.IntegrationTests.Models.ChatMessage'")); + var errorMessages = inMemoryLogger.Logs.Where(x => x.Message.StartsWith("'") && x.Message.Contains("is not a valid subscriber mapping")); Assert.NotEmpty(errorMessages); Assert.True(errorMessages.Count() >= numberOfMessages); Assert.True(timeElapsed.TotalSeconds > 59); diff --git a/test/AWS.Messaging.UnitTests/SerializationTests/EnvelopeSerializerTests.cs b/test/AWS.Messaging.UnitTests/SerializationTests/EnvelopeSerializerTests.cs index 254d9f6a..7393e139 100644 --- a/test/AWS.Messaging.UnitTests/SerializationTests/EnvelopeSerializerTests.cs +++ b/test/AWS.Messaging.UnitTests/SerializationTests/EnvelopeSerializerTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.IO; using System.Text; using System.Text.Json; using System.Threading.Tasks; @@ -564,6 +565,50 @@ public async Task ConvertToEnvelopeAsync_DataMessageLogging_WithError(bool dataM Assert.Null(exception.InnerException); } } + + [Fact] + public async Task ConvertToEnvelope_NullSubscriberMapping_ThrowsException() + { + // ARRANGE + var serviceProvider = _serviceCollection.BuildServiceProvider(); + var envelopeSerializer = serviceProvider.GetRequiredService(); + var messageEnvelope = new MessageEnvelope + { + Id = "66659d05-e4ff-462f-81c4-09e560e66a5c", + Source = new Uri("/aws/messaging", UriKind.Relative), + Version = "1.0", + MessageTypeIdentifier = "unknownMessageType", // Using an unknown message type + TimeStamp = _testdate, + Message = new AddressInfo + { + Street = "Prince St", + Unit = 123, + ZipCode = "00001" + } + }; + + var sqsMessage = new Message + { + Body = await envelopeSerializer.SerializeAsync(messageEnvelope), + ReceiptHandle = "receipt-handle" + }; + + // ACT & ASSERT + var exception = await Assert.ThrowsAsync( + async () => await envelopeSerializer.ConvertToEnvelopeAsync(sqsMessage) + ); + + // Verify the exception message + Assert.Equal("Failed to create MessageEnvelope", exception.Message); + + // Verify the inner exception type and message + Assert.IsType(exception.InnerException); + var innerException = exception.InnerException as InvalidDataException; + Assert.Contains("'unknownMessageType' is not a valid subscriber mapping.", innerException.Message); + Assert.Contains("Available mappings:", innerException.Message); + Assert.Contains("addressInfo", innerException.Message); + } + } public class MockSerializationCallback : ISerializationCallback