161 lines
5.4 KiB
C#
161 lines
5.4 KiB
C#
|
|
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);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|