106 lines
3.5 KiB
C#
106 lines
3.5 KiB
C#
|
|
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"));
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|