using System.Reflection; using System.Text.Json; using System.IO; using NUnit.Framework; namespace ComplianceNFs.Tests { [TestFixture] public class AuditComplianceNFsTest { private readonly string solutionRoot = @"x:\Back\Carteira x.x\Codigo\ComplianceNFs"; [Test] public void ProjectStructure_ShouldContainAllProjects() { var expectedProjects = new[] { "ComplianceNFs.Core", "ComplianceNFs.Infrastructure", "ComplianceNFs.Service", "ComplianceNFs.Monitor" }; foreach (var proj in expectedProjects) { var csproj = Directory.GetFiles(solutionRoot, $"{proj}.csproj", SearchOption.AllDirectories).FirstOrDefault(); NUnit.Framework.Assert.That(csproj, Is.Not.Null, $"Project {proj} not found."); } } [Test] public void CoreProject_ShouldContainRequiredTypesAndInterfaces() { var coreDll = Directory.GetFiles(solutionRoot, "ComplianceNFs.Core.dll", SearchOption.AllDirectories).FirstOrDefault(); NUnit.Framework.Assert.That(coreDll, NUnit.Framework.Is.Not.Null, "ComplianceNFs.Core.dll not found. Build the solution first."); var asm = Assembly.LoadFrom(coreDll!); NUnit.Framework.Assert.That(asm.GetType("ComplianceNFs.Core.BuyingRecord"), NUnit.Framework.Is.Not.Null, "BuyingRecord class missing."); NUnit.Framework.Assert.That(asm.GetType("ComplianceNFs.Core.EnergyInvoice"), NUnit.Framework.Is.Not.Null, "EnergyInvoice class missing."); NUnit.Framework.Assert.That(asm.GetType("ComplianceNFs.Core.InvoiceStatus"), NUnit.Framework.Is.Not.Null, "InvoiceStatus enum missing."); var interfaces = new[] { "IMailListener", "IXmlParser", "IPdfParser", "IAccessDbRepository", "IAttachmentRepository" }; foreach (var iface in interfaces) { NUnit.Framework.Assert.That(asm.GetType($"ComplianceNFs.Core.{iface}"), NUnit.Framework.Is.Not.Null, $"Interface {iface} missing."); } } [Test] public void InfrastructureProject_ShouldImplementCoreInterfaces() { var infraDll = Directory.GetFiles(solutionRoot, "ComplianceNFs.Infrastructure.dll", SearchOption.AllDirectories).FirstOrDefault(); var coreDll = Directory.GetFiles(solutionRoot, "ComplianceNFs.Core.dll", SearchOption.AllDirectories).FirstOrDefault(); NUnit.Framework.Assert.That(infraDll, NUnit.Framework.Is.Not.Null, "ComplianceNFs.Infrastructure.dll not found."); NUnit.Framework.Assert.That(coreDll, NUnit.Framework.Is.Not.Null, "ComplianceNFs.Core.dll not found."); var infraAsm = Assembly.LoadFrom(infraDll!); var coreAsm = Assembly.LoadFrom(coreDll!); var interfaceImpls = new (string iface, string impl)[] { ("IMailListener", "MailListener"), ("IXmlParser", "XmlParser"), ("IPdfParser", "PdfParser"), ("IAccessDbRepository", "AccessDbRepository"), ("IAttachmentRepository", "AttachmentRepository") }; foreach (var (iface, impl) in interfaceImpls) { var ifaceType = coreAsm.GetType($"ComplianceNFs.Core.{iface}"); var implType = infraAsm.GetType($"ComplianceNFs.Infrastructure.{impl}"); NUnit.Framework.Assert.That(implType, NUnit.Framework.Is.Not.Null, $"Implementation {impl} missing."); NUnit.Framework.Assert.That(ifaceType, NUnit.Framework.Is.Not.Null, $"Interface {iface} missing in core assembly."); NUnit.Framework.Assert.That(ifaceType!.IsAssignableFrom(implType!), NUnit.Framework.Is.True, $"{impl} does not implement {iface}."); } var archiver = infraAsm.GetTypes().FirstOrDefault(t => t.Name.Contains("Archiver") || t.Name.Contains("FileArchiver")); NUnit.Framework.Assert.That(archiver, NUnit.Framework.Is.Not.Null, "FileArchiver or equivalent not found."); } [Test] public void ServiceProject_ShouldUseGenericHostAndRegisterServices() { var serviceDir = Directory.GetDirectories(solutionRoot, "ComplianceNFs.Service", SearchOption.TopDirectoryOnly).FirstOrDefault(); NUnit.Framework.Assert.That(serviceDir, NUnit.Framework.Is.Not.Null, "ComplianceNFs.Service directory not found."); var programFile = Directory.GetFiles(serviceDir!, "Program.cs", SearchOption.AllDirectories).FirstOrDefault(); NUnit.Framework.Assert.That(programFile, NUnit.Framework.Is.Not.Null, "Program.cs not found in Service project."); var code = File.ReadAllText(programFile!); NUnit.Framework.Assert.That(code.Contains("Host.CreateDefaultBuilder"), NUnit.Framework.Is.True, "Generic Host not used."); NUnit.Framework.Assert.That(code.Contains("ConfigureServices"), NUnit.Framework.Is.True, "DI registration missing."); NUnit.Framework.Assert.That(code.Contains("MailListener"), NUnit.Framework.Is.True, "MailListener not referenced in startup."); NUnit.Framework.Assert.That(code.Contains("appsettings.json"), NUnit.Framework.Is.True, "appsettings.json not referenced."); } [Test] public void MonitorProject_ShouldContainWPFArtifacts() { var monitorDir = Directory.GetDirectories(solutionRoot, "ComplianceNFs.Monitor", SearchOption.TopDirectoryOnly).FirstOrDefault(); NUnit.Framework.Assert.That(monitorDir, NUnit.Framework.Is.Not.Null, "ComplianceNFs.Monitor directory not found."); NUnit.Framework.Assert.That(File.Exists(Path.Combine(monitorDir!, "MainWindow.xaml")), NUnit.Framework.Is.True, "MainWindow.xaml missing."); NUnit.Framework.Assert.That(File.Exists(Path.Combine(monitorDir!, "MonitorViewModel.cs")), NUnit.Framework.Is.True, "MonitorViewModel.cs missing."); var mainWindowCode = File.ReadAllText(Path.Combine(monitorDir!, "MainWindow.xaml")); NUnit.Framework.Assert.That(mainWindowCode.Contains("Force Scan"), NUnit.Framework.Is.True, "Force Scan button not found in MainWindow.xaml."); } [Test] public void AppSettings_ShouldContainRequiredKeys() { var appsettings = Directory.GetFiles(solutionRoot, "appsettings.json", SearchOption.AllDirectories).FirstOrDefault(); NUnit.Framework.Assert.That(appsettings, NUnit.Framework.Is.Not.Null, "appsettings.json not found."); var json = File.ReadAllText(appsettings!); using var doc = JsonDocument.Parse(json); var root = doc.RootElement; NUnit.Framework.Assert.That(root.TryGetProperty("AccessConnectionString", out _), NUnit.Framework.Is.True, "AccessConnectionString missing."); NUnit.Framework.Assert.That(root.TryGetProperty("PostgresConnectionString", out _), NUnit.Framework.Is.True, "PostgresConnectionString missing."); NUnit.Framework.Assert.That(root.TryGetProperty("Mail", out _), NUnit.Framework.Is.True, "Mail settings missing."); NUnit.Framework.Assert.That(root.TryGetProperty("Tolerances", out _), NUnit.Framework.Is.True, "Tolerances missing."); NUnit.Framework.Assert.That(root.TryGetProperty("ArchiveBasePath", out _), NUnit.Framework.Is.True, "ArchiveBasePath missing."); } [Test] public void MatchingService_ShouldApplyTolerances() { // This is a stub: in a real test, instantiate MatchingService and test with in-memory data. NUnit.Framework.Assert.Pass("Stub: Implement in-memory test for MatchingService tolerances (±1%, ±0.5%)."); } [Test] public void ComplianceService_ShouldComputeImpliedTaxWithinTolerance() { // This is a stub: in a real test, instantiate ComplianceService and test with in-memory data. NUnit.Framework.Assert.Pass("Stub: Implement in-memory test for ComplianceService implied tax logic (±1%)."); } [Test] public void NotificationService_ShouldSendEmailOnMismatch() { // This is a stub: in a real test, mock NotificationService and verify email send on mismatch. NUnit.Framework.Assert.Pass("Stub: Implement NotificationService email send test."); } [Test] public void ArchivingService_ShouldMoveFilesToStatusFolders() { // This is a stub: in a real test, mock file system and verify archiving logic. NUnit.Framework.Assert.Pass("Stub: Implement ArchivingService file move test."); } } }