Files
agrynco 2757869176 feat: consume transactional email notifications
Add contract validation, SMTP delivery results, terminal failure context, neutral development seeding, and local Docker setup.

Ref: IT-1033
2026-08-04 12:32:28 +03:00

61 lines
2.4 KiB
C#

namespace HrynCo.NotificationService.Services.Tests.EmailProcessing;
using System.Text.Json;
using HrynCo.NotificationService.Contracts.Messages;
using HrynCo.NotificationService.Worker.Services.EmailProcessing;
public sealed class SendEmailContractTests
{
private const string ItemTrackerPayload = """
{
"CorrelationContext": {
"CorrelationId": "3ec4ad3f-0a8a-49f3-b31d-cdad5d1b95cc",
"ReplyTo": "item-tracker.notifications.result"
},
"Data": {
"ServiceName": "StoreMate-Prod",
"TemplateKey": "EmailVerification",
"RecipientEmail": "owner@example.com",
"RecipientName": "StoreMate Owner",
"Variables": {
"AppName": "StoreMate",
"VerificationUrl": "https://example.invalid/sensitive-token"
},
"LanguageCode": "uk"
}
}
""";
[Fact]
public void PascalCaseItemTrackerPayload_DeserializesWithoutLosingValues()
{
SendEmailMessage? message = JsonSerializer.Deserialize<SendEmailMessage>(ItemTrackerPayload);
Assert.NotNull(message);
SendEmailMessageValidator.Validate(message);
Assert.Equal("3ec4ad3f-0a8a-49f3-b31d-cdad5d1b95cc", message.CorrelationContext.CorrelationId);
Assert.Equal("item-tracker.notifications.result", message.CorrelationContext.ReplyTo);
Assert.Equal("StoreMate-Prod", message.Data.ServiceName);
Assert.Equal("EmailVerification", message.Data.TemplateKey);
Assert.Equal("owner@example.com", message.Data.RecipientEmail);
Assert.Equal("StoreMate Owner", message.Data.RecipientName);
Assert.Equal("uk", message.Data.LanguageCode);
Assert.Equal("StoreMate", message.Data.Variables["AppName"]);
Assert.Equal(
"https://example.invalid/sensitive-token",
message.Data.Variables["VerificationUrl"]);
}
[Fact]
public void MissingLanguageCode_IsRejected()
{
SendEmailMessage? message = JsonSerializer.Deserialize<SendEmailMessage>(
ItemTrackerPayload.Replace("\"uk\"", "null", StringComparison.Ordinal));
InvalidDataException exception = Assert.Throws<InvalidDataException>(
() => SendEmailMessageValidator.Validate(message!));
Assert.Equal("LanguageCode is required.", exception.Message);
}
}