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")); }); } }