test(export): assert platform order CSV by parsing headers and rows

This commit is contained in:
萝卜
2026-03-17 20:56:52 +08:00
parent b754ecfa5f
commit bf73f6dcae

View File

@@ -12,6 +12,29 @@ class AdminPlatformOrderExportTest extends TestCase
{
use RefreshDatabase;
private function parseCsvToRows(string $content): array
{
// 去 BOM避免表头第一列带 \xEF\xBB\xBF
if (str_starts_with($content, "\xEF\xBB\xBF")) {
$content = substr($content, 3);
}
$fp = fopen('php://temp', 'r+');
fwrite($fp, $content);
rewind($fp);
$rows = [];
while (($row = fgetcsv($fp)) !== false) {
if ($row === [null] || $row === false) {
continue;
}
$rows[] = $row;
}
fclose($fp);
return $rows;
}
protected function loginAsPlatformAdmin(): void
{
$this->seed();
@@ -119,18 +142,33 @@ class AdminPlatformOrderExportTest extends TestCase
// StreamedResponse 在测试环境下需用 streamedContent() 获取内容
$content = $res->streamedContent();
$this->assertStringContainsString('订单号', $content);
$this->assertStringContainsString('PO_EXPORT_0001', $content);
$this->assertStringContainsString('同步失败原因', $content);
$this->assertStringContainsString('订阅ID', $content);
$this->assertStringContainsString('BMPA失败原因', $content);
$this->assertStringContainsString('最近批量标记支付并生效时间', $content);
$this->assertStringContainsString('最近批量标记支付并生效管理员', $content);
$this->assertStringContainsString('最近批量生效时间', $content);
$this->assertStringContainsString('最近批量生效管理员', $content);
$this->assertStringContainsString('退款总额', $content);
$this->assertStringContainsString('对账不一致', $content);
$this->assertStringContainsString('退款不一致', $content);
// 解析 CSV 后按“表头/行数据”断言,避免未来表头顺序/分隔符等变更造成脆断。
$rows = $this->parseCsvToRows($content);
$this->assertGreaterThanOrEqual(2, count($rows));
$headers = $rows[0];
$this->assertContains('订单号', $headers);
$this->assertContains('同步失败原因', $headers);
$this->assertContains('订阅ID', $headers);
$this->assertContains('BMPA失败原因', $headers);
$this->assertContains('最近批量标记支付并生效时间', $headers);
$this->assertContains('最近批量标记支付并生效管理员', $headers);
$this->assertContains('最近批量生效时间', $headers);
$this->assertContains('最近批量生效管理员', $headers);
$this->assertContains('退款总额', $headers);
$this->assertContains('对账不一致', $headers);
$this->assertContains('退款不一致', $headers);
// 至少应包含我们造的那条订单
$found = false;
foreach ($rows as $r) {
if (in_array('PO_EXPORT_0001', $r, true)) {
$found = true;
break;
}
}
$this->assertTrue($found, 'CSV should contain row for PO_EXPORT_0001');
// include_meta=1 时应包含 meta(JSON) 列
$res2 = $this->get('/admin/platform-orders/export?download=1&include_meta=1');