test: 添加 CLI 命令单元测试
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
using Gpulse.WCT.DataAnalyzer.Core.Domain.Release;
|
||||
|
||||
namespace Gpulse.WCT.DataAnalyzer.Tests.Commands;
|
||||
|
||||
[TestFixture]
|
||||
public class ExportCommandTests : CommandTestBase
|
||||
{
|
||||
private static string ResolveOutputDir(params string[] segments) =>
|
||||
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, string.Join(Path.DirectorySeparatorChar, segments));
|
||||
|
||||
[Test]
|
||||
public async Task Export_ChargingParametersCsv_WritesFile()
|
||||
{
|
||||
Host.ReleaseDb.ChargingParameters.Add(new ChargingParameterRecord
|
||||
{
|
||||
CarFactory = "TestFactory",
|
||||
CarModel = "ModelX",
|
||||
PhoneBrand = "Apple",
|
||||
PhoneModel = "iPhone15",
|
||||
Power350mW = 100,
|
||||
Power500mW = 200,
|
||||
});
|
||||
await Host.ReleaseDb.SaveChangesAsync();
|
||||
|
||||
var (code, stdout, _) = await Export().RunCaptureAsync(
|
||||
"--format", "csv",
|
||||
"--type", "charging-parameters",
|
||||
"--output", "data/output/export_cp");
|
||||
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(code, Is.EqualTo(0));
|
||||
Assert.That(stdout, Does.Contain("ChargingParameterDatabase CSV exported"));
|
||||
});
|
||||
|
||||
var file = Path.Combine(ResolveOutputDir("data", "output", "export_cp"), "WCT-ChargingParameterDatabase.csv");
|
||||
Assert.That(File.Exists(file), Is.True);
|
||||
|
||||
var content = await File.ReadAllTextAsync(file);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(content, Does.Contain("车厂"));
|
||||
Assert.That(content, Does.Contain("TestFactory"));
|
||||
Assert.That(content, Does.Contain("iPhone15"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Export_QfodCsv_AfterParse_WritesFile()
|
||||
{
|
||||
var dir = NewDir();
|
||||
var file = TestFixtures.WriteQfodLog(dir, TestFixtures.QfodFileName, 20, 25, 21);
|
||||
await Parse().RunCaptureAsync("--file", file);
|
||||
|
||||
// 导出文件名带时间戳,先清空输出目录避免跨运行残留文件
|
||||
var outDir = ResolveOutputDir("data", "output", "export_qfod");
|
||||
if (Directory.Exists(outDir))
|
||||
Directory.Delete(outDir, recursive: true);
|
||||
|
||||
var (code, stdout, _) = await Export().RunCaptureAsync(
|
||||
"--format", "csv",
|
||||
"--type", "qfod",
|
||||
"--output", "data/output/export_qfod");
|
||||
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(code, Is.EqualTo(0));
|
||||
Assert.That(stdout, Does.Contain("Qfod CSV exported"));
|
||||
});
|
||||
|
||||
var exported = Directory.GetFiles(outDir, "qfod_export_*.csv").Single();
|
||||
var content = await File.ReadAllTextAsync(exported);
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(content, Does.Contain("delta_q"));
|
||||
Assert.That(content, Does.Contain("iPhone15"));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Export_UnknownFormat_PrintsMessage()
|
||||
{
|
||||
var (code, stdout, _) = await Export().RunCaptureAsync("--format", "xml");
|
||||
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(code, Is.EqualTo(0));
|
||||
Assert.That(stdout, Does.Contain("Unknown format: xml. Use 'csv' or 'json'."));
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Export_PathTraversal_PrintsFailure()
|
||||
{
|
||||
var (code, stdout, _) = await Export().RunCaptureAsync(
|
||||
"--format", "csv",
|
||||
"--output", "../evil");
|
||||
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
Assert.That(code, Is.EqualTo(0));
|
||||
Assert.That(stdout, Does.Contain("Export failed"));
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user