diff --git a/tests/Feature/AdminPlatformOrderExportTest.php b/tests/Feature/AdminPlatformOrderExportTest.php index ee32b6c..5412684 100644 --- a/tests/Feature/AdminPlatformOrderExportTest.php +++ b/tests/Feature/AdminPlatformOrderExportTest.php @@ -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');