using SSPCTester.Logic.Models; using SSPCTester.Logic.Report; namespace SSPCTester.Tests; public sealed class ReportFileHelperTests { [Fact] public void ResolveFileName_ExpandsVariablesAndKeepsPdfExtension() { var project = new Project { Name = "ProjectA", Dut = { ProductName = "SSPC", Model = "M24", SerialNumber = "SN001" }, Report = { FileName = "{ProjectName}_{SerialNumber}_{yyyyMMdd_HHmmss}.pdf" } }; string fileName = ReportFileHelper.ResolveFileName(project, new DateTime(2026, 6, 28, 9, 8, 7)); Assert.Equal("ProjectA_SN001_20260628_090807.pdf", fileName); } [Fact] public void ResolveFileName_CanUseWordExtensionFromSameTemplate() { var project = new Project { Name = "ProjectA", Dut = { SerialNumber = "SN001" }, Report = { FileName = "{ProjectName}_{SerialNumber}_{yyyyMMdd_HHmmss}.pdf" } }; string fileName = ReportFileHelper.ResolveFileName(project, new DateTime(2026, 6, 28, 9, 8, 7), ".docx"); Assert.Equal("ProjectA_SN001_20260628_090807.docx", fileName); } [Fact] public void ResolveFileName_CleansInvalidCharactersAndAddsPdfExtension() { var project = new Project { Name = "A:B/C", Report = { FileName = "{ProjectName}_{Date}" } }; string fileName = ReportFileHelper.ResolveFileName(project, new DateTime(2026, 6, 28, 0, 0, 0)); Assert.Equal("A_B_C_20260628.pdf", fileName); } [Fact] public void ResolveFileName_UsesFallbackForBlankTemplate() { var project = new Project { Report = { FileName = " " } }; string fileName = ReportFileHelper.ResolveFileName(project, new DateTime(2026, 6, 28, 1, 2, 3)); Assert.Equal("report_20260628_010203.pdf", fileName); } [Theory] [InlineData("Pdf", ReportOutputFormat.Pdf)] [InlineData("word", ReportOutputFormat.Word)] [InlineData("BOTH", ReportOutputFormat.Both)] [InlineData("invalid", ReportOutputFormat.Pdf)] [InlineData(null, ReportOutputFormat.Pdf)] public void ParseFormat_HandlesKnownValuesAndFallsBackToPdf(string? value, ReportOutputFormat expected) { Assert.Equal(expected, ReportFileHelper.ParseFormat(value)); } [Fact] public void EnumeratePdfFiles_SortsByLastWriteTimeDescending() { string folder = Path.Combine(Path.GetTempPath(), "SSPCTester-reports-" + Guid.NewGuid().ToString("N")); try { Directory.CreateDirectory(folder); string older = Path.Combine(folder, "older.pdf"); string newer = Path.Combine(folder, "newer.pdf"); string ignored = Path.Combine(folder, "ignored.txt"); File.WriteAllText(older, "old"); File.WriteAllText(newer, "new"); File.WriteAllText(ignored, "txt"); File.SetLastWriteTime(older, new DateTime(2026, 6, 27, 8, 0, 0)); File.SetLastWriteTime(newer, new DateTime(2026, 6, 28, 8, 0, 0)); var files = ReportFileHelper.EnumeratePdfFiles(folder); Assert.Equal(2, files.Count); Assert.Equal("newer.pdf", files[0].DisplayName); Assert.Equal("older.pdf", files[1].DisplayName); } finally { if (Directory.Exists(folder)) Directory.Delete(folder, true); } } [Fact] public void EnumerateReportFiles_BothIncludesPdfAndWord() { string folder = Path.Combine(Path.GetTempPath(), "SSPCTester-reports-" + Guid.NewGuid().ToString("N")); try { Directory.CreateDirectory(folder); string pdf = Path.Combine(folder, "a.pdf"); string docx = Path.Combine(folder, "b.docx"); File.WriteAllText(pdf, "pdf"); File.WriteAllText(docx, "docx"); var files = ReportFileHelper.EnumerateReportFiles(folder, ReportOutputFormat.Both); Assert.Contains(files, x => x.DisplayName == "a.pdf" && x.Kind == ReportFileKind.Pdf); Assert.Contains(files, x => x.DisplayName == "b.docx" && x.Kind == ReportFileKind.Word); } finally { if (Directory.Exists(folder)) Directory.Delete(folder, true); } } [Fact] public void ReportInfo_RoundTripsBesideReport() { string folder = Path.Combine(Path.GetTempPath(), "SSPCTester-reports-" + Guid.NewGuid().ToString("N")); try { Directory.CreateDirectory(folder); string report = Path.Combine(folder, "report.docx"); File.WriteAllText(report, ""); var info = new ReportInfo { ProjectName = "ProjectA", ProductName = "SSPC", GeneratedAt = new DateTime(2026, 6, 28, 12, 0, 0), Format = ReportOutputFormat.Word.ToString(), WordPath = report, OverallStatus = TestStatus.Pass.ToString() }; ReportFileHelper.SaveInfo(info, ReportFileHelper.BuildInfoPath(report)); var loaded = ReportFileHelper.LoadInfoForReport(report); Assert.NotNull(loaded); Assert.Equal("ProjectA", loaded.ProjectName); Assert.Equal(report, loaded.WordPath); } finally { if (Directory.Exists(folder)) Directory.Delete(folder, true); } } }