From 4f01232f356d8d602bd2d7a8acb978c6318c35c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=9D=E5=8D=9C?= Date: Tue, 17 Mar 2026 00:08:21 +0800 Subject: [PATCH] Tests: cover clear BMPA errors blocking for sync_status/synced_only --- ...aErrorsShouldBlockWhenNotBmpaScopeTest.php | 127 +++++++----------- 1 file changed, 52 insertions(+), 75 deletions(-) diff --git a/tests/Feature/AdminPlatformOrderClearBmpaErrorsShouldBlockWhenNotBmpaScopeTest.php b/tests/Feature/AdminPlatformOrderClearBmpaErrorsShouldBlockWhenNotBmpaScopeTest.php index 057bb25..546dd81 100644 --- a/tests/Feature/AdminPlatformOrderClearBmpaErrorsShouldBlockWhenNotBmpaScopeTest.php +++ b/tests/Feature/AdminPlatformOrderClearBmpaErrorsShouldBlockWhenNotBmpaScopeTest.php @@ -22,14 +22,13 @@ class AdminPlatformOrderClearBmpaErrorsShouldBlockWhenNotBmpaScopeTest extends T ])->assertRedirect('/admin'); } - public function test_clear_bmpa_errors_filtered_should_block_when_syncable_only_is_set(): void + protected function makeBmpaFailedOrder(string $orderNo, string $planCode): PlatformOrder { - $this->loginAsPlatformAdmin(); - $merchant = Merchant::query()->firstOrFail(); + $plan = Plan::query()->create([ - 'code' => 'clear_bmpa_err_conflict_syncable_only_plan', - 'name' => '清理BMPA失败标记冲突(syncable_only)测试套餐', + 'code' => $planCode, + 'name' => '清理BMPA失败标记阻断测试套餐:' . $planCode, 'billing_cycle' => 'monthly', 'price' => 1, 'list_price' => 1, @@ -38,10 +37,10 @@ class AdminPlatformOrderClearBmpaErrorsShouldBlockWhenNotBmpaScopeTest extends T 'published_at' => now(), ]); - $order = PlatformOrder::query()->create([ + return PlatformOrder::query()->create([ 'merchant_id' => $merchant->id, 'plan_id' => $plan->id, - 'order_no' => 'PO_CLEAR_BMPA_CONFLICT_SYNCABLE_ONLY_0001', + 'order_no' => $orderNo, 'order_type' => 'new_purchase', 'status' => 'pending', 'payment_status' => 'unpaid', @@ -60,6 +59,13 @@ class AdminPlatformOrderClearBmpaErrorsShouldBlockWhenNotBmpaScopeTest extends T ], ], ]); + } + + public function test_clear_bmpa_errors_filtered_should_block_when_syncable_only_is_set(): void + { + $this->loginAsPlatformAdmin(); + + $order = $this->makeBmpaFailedOrder('PO_CLEAR_BMPA_CONFLICT_SYNCABLE_ONLY_0001', 'clear_bmpa_err_conflict_syncable_only_plan'); $this->post('/admin/platform-orders/clear-bmpa-errors', [ 'scope' => 'filtered', @@ -76,40 +82,7 @@ class AdminPlatformOrderClearBmpaErrorsShouldBlockWhenNotBmpaScopeTest extends T { $this->loginAsPlatformAdmin(); - $merchant = Merchant::query()->firstOrFail(); - $plan = Plan::query()->create([ - 'code' => 'clear_bmpa_err_conflict_sync_fail_filters_plan', - 'name' => '清理BMPA失败标记冲突(同步失败筛选)测试套餐', - 'billing_cycle' => 'monthly', - 'price' => 1, - 'list_price' => 1, - 'status' => 'active', - 'sort' => 10, - 'published_at' => now(), - ]); - - $order = PlatformOrder::query()->create([ - 'merchant_id' => $merchant->id, - 'plan_id' => $plan->id, - 'order_no' => 'PO_CLEAR_BMPA_CONFLICT_SYNC_FAIL_FILTERS_0001', - 'order_type' => 'new_purchase', - 'status' => 'pending', - 'payment_status' => 'unpaid', - 'plan_name' => $plan->name, - 'billing_cycle' => $plan->billing_cycle, - 'period_months' => 1, - 'quantity' => 1, - 'payable_amount' => 1, - 'paid_amount' => 0, - 'placed_at' => now(), - 'meta' => [ - 'batch_mark_paid_and_activate_error' => [ - 'message' => '模拟 BMPA 失败', - 'at' => now()->toDateTimeString(), - 'admin_id' => 1, - ], - ], - ]); + $order = $this->makeBmpaFailedOrder('PO_CLEAR_BMPA_CONFLICT_SYNC_FAIL_FILTERS_0001', 'clear_bmpa_err_conflict_sync_fail_filters_plan'); // 故意传入“同步失败”筛选(与 BMPA 清理不匹配) $this->post('/admin/platform-orders/clear-bmpa-errors', [ @@ -123,44 +96,48 @@ class AdminPlatformOrderClearBmpaErrorsShouldBlockWhenNotBmpaScopeTest extends T $this->assertNotEmpty(data_get($order->meta, 'batch_mark_paid_and_activate_error.message')); } + public function test_clear_bmpa_errors_filtered_should_block_when_sync_status_filter_is_present(): void + { + $this->loginAsPlatformAdmin(); + + $order = $this->makeBmpaFailedOrder('PO_CLEAR_BMPA_CONFLICT_SYNC_STATUS_0001', 'clear_bmpa_err_conflict_sync_status_plan'); + + // 即便锁定了 bmpa_failed_only,但叠加 sync_status 也应阻断(避免误清理/集合语义混乱)。 + $this->post('/admin/platform-orders/clear-bmpa-errors', [ + 'scope' => 'filtered', + 'bmpa_failed_only' => '1', + 'sync_status' => 'failed', + ]) + ->assertRedirect() + ->assertSessionHas('warning'); + + $order->refresh(); + $this->assertNotEmpty(data_get($order->meta, 'batch_mark_paid_and_activate_error.message')); + } + + public function test_clear_bmpa_errors_filtered_should_block_when_synced_only_filter_is_present(): void + { + $this->loginAsPlatformAdmin(); + + $order = $this->makeBmpaFailedOrder('PO_CLEAR_BMPA_CONFLICT_SYNCED_ONLY_0001', 'clear_bmpa_err_conflict_synced_only_plan'); + + $this->post('/admin/platform-orders/clear-bmpa-errors', [ + 'scope' => 'filtered', + 'bmpa_failed_only' => '1', + 'synced_only' => '1', + ]) + ->assertRedirect() + ->assertSessionHas('warning'); + + $order->refresh(); + $this->assertNotEmpty(data_get($order->meta, 'batch_mark_paid_and_activate_error.message')); + } + public function test_clear_bmpa_errors_filtered_should_block_when_no_bmpa_scope_filters_are_set(): void { $this->loginAsPlatformAdmin(); - $merchant = Merchant::query()->firstOrFail(); - $plan = Plan::query()->create([ - 'code' => 'clear_bmpa_err_block_no_scope_plan', - 'name' => '清理BMPA失败标记阻断(无口径)测试套餐', - 'billing_cycle' => 'monthly', - 'price' => 1, - 'list_price' => 1, - 'status' => 'active', - 'sort' => 10, - 'published_at' => now(), - ]); - - $order = PlatformOrder::query()->create([ - 'merchant_id' => $merchant->id, - 'plan_id' => $plan->id, - 'order_no' => 'PO_CLEAR_BMPA_BLOCK_NO_SCOPE_0001', - 'order_type' => 'new_purchase', - 'status' => 'pending', - 'payment_status' => 'unpaid', - 'plan_name' => $plan->name, - 'billing_cycle' => $plan->billing_cycle, - 'period_months' => 1, - 'quantity' => 1, - 'payable_amount' => 1, - 'paid_amount' => 0, - 'placed_at' => now(), - 'meta' => [ - 'batch_mark_paid_and_activate_error' => [ - 'message' => '模拟 BMPA 失败', - 'at' => now()->toDateTimeString(), - 'admin_id' => 1, - ], - ], - ]); + $order = $this->makeBmpaFailedOrder('PO_CLEAR_BMPA_BLOCK_NO_SCOPE_0001', 'clear_bmpa_err_block_no_scope_plan'); $this->post('/admin/platform-orders/clear-bmpa-errors', [ 'scope' => 'filtered',