using System; using System.Net.Mail; using System.Threading.Tasks; using System.Collections.Generic; using System.IO; using Xunit; using Moq; using ComplianceNFs.Core.Application.Services; using ComplianceNFs.Core.Ports; using ComplianceNFs.Core.Entities; using Microsoft.Extensions.Logging; namespace ComplianceNFs.Infrastructure.Tests { public class InvoiceIngestionServiceTests { [Fact] public void OnNewMailReceived_ParsesXmlAttachmentAndSavesInvoice() { // Arrange var mockMailListener = new Mock(); var mockAttachmentRepo = new Mock(); var mockXmlParser = new Mock(); var mockPdfParser = new Mock(); var mockLogger = new Mock>(); var testParsed = new ParsedInvoice { CnpjComp = "123", NumeroNF = "456" }; mockXmlParser.Setup(x => x.Parse(It.IsAny())).Returns(testParsed); var service = new InvoiceIngestionService( mockMailListener.Object, mockAttachmentRepo.Object, mockXmlParser.Object, mockPdfParser.Object, mockLogger.Object ); var mail = new MailMessage { From = new MailAddress("test@supplier.com"), Subject = "Test Invoice", Headers = { ["Message-ID"] = "msgid", ["Date"] = DateTime.Now.ToString(), ["Conversation-ID"] = "conv-id" } }; var xmlContent = new MemoryStream(System.Text.Encoding.UTF8.GetBytes("")); var attachment = new Attachment(xmlContent, "invoice.xml"); mail.Attachments.Add(attachment); // Act // Simulate event mockMailListener.Raise(m => m.NewMailReceived += null, mail); // Assert mockXmlParser.Verify(x => x.Parse(It.IsAny()), Times.Once); mockAttachmentRepo.Verify(x => x.SaveRawAsync(It.Is(inv => inv.CnpjComp == "123" && inv.Filename == "invoice.xml")), Times.Once); } } }