test(export): assert platform order CSV by parsing headers and rows
This commit is contained in:
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user