Files
saasshop/tests/Feature/AdminPlatformOrderShowActivateSubscriptionButtonDisabledWhenGovernanceMismatchTest.php

165 lines
6.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace Tests\Feature;
use App\Models\Merchant;
use App\Models\Plan;
use App\Models\PlatformOrder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class AdminPlatformOrderShowActivateSubscriptionButtonDisabledWhenGovernanceMismatchTest extends TestCase
{
use RefreshDatabase;
protected function loginAsPlatformAdmin(): void
{
$this->seed();
$this->post('/admin/login', [
'email' => 'platform.admin@demo.local',
'password' => 'Platform@123456',
])->assertRedirect('/admin');
}
public function test_activate_subscription_button_should_be_disabled_and_show_governance_block_when_reconcile_mismatch(): void
{
$this->loginAsPlatformAdmin();
$merchant = Merchant::query()->firstOrFail();
$plan = Plan::query()->create([
'code' => 'po_show_disable_sync_reconcile_mismatch_plan',
'name' => '同步订阅禁用-对账不一致测试套餐',
'billing_cycle' => 'monthly',
'price' => 10,
'list_price' => 10,
'status' => 'active',
'sort' => 10,
'published_at' => now(),
]);
// 已支付+已生效,但回执总额=9paid_amount=10 => reconcile_mismatch=true
$order = PlatformOrder::query()->create([
'merchant_id' => $merchant->id,
'plan_id' => $plan->id,
'order_no' => 'PO_SHOW_DISABLE_SYNC_RECON_0001',
'order_type' => 'new_purchase',
'status' => 'activated',
'payment_status' => 'paid',
'plan_name' => $plan->name,
'billing_cycle' => $plan->billing_cycle,
'period_months' => 1,
'quantity' => 1,
'payable_amount' => 10,
'paid_amount' => 10,
'placed_at' => now(),
'paid_at' => now(),
'activated_at' => now(),
'meta' => [
'payment_summary' => [
'count' => 1,
'total_amount' => 9,
],
'payment_receipts' => [
[
'type' => 'bank_transfer',
'channel' => 'offline',
'amount' => 9,
'paid_at' => now()->toDateTimeString(),
'created_at' => now()->toDateTimeString(),
'admin_id' => 1,
],
],
],
]);
$res = $this->get('/admin/platform-orders/' . $order->id);
$res->assertOk();
$res->assertSee('同步订阅治理提示', false);
$res->assertSee('去补回执', false);
$res->assertSee('disabled', false);
$html = (string) $res->getContent();
preg_match_all('/href="([^"]+)"/', $html, $m);
$hrefs = $m[1] ?? [];
$links = array_values(array_filter($hrefs, fn ($u) => str_starts_with($u, '/admin/platform-orders/' . $order->id) && str_contains($u, '#add-payment-receipt')));
$this->assertGreaterThanOrEqual(1, count($links), '未找到指向 #add-payment-receipt 的治理链接');
$parts = parse_url($links[0]);
$this->assertSame('/admin/platform-orders/' . $order->id, $parts['path'] ?? '');
$this->assertSame('add-payment-receipt', $parts['fragment'] ?? '');
}
public function test_activate_subscription_button_should_be_disabled_and_show_governance_block_when_refund_inconsistent(): void
{
$this->loginAsPlatformAdmin();
$merchant = Merchant::query()->firstOrFail();
$plan = Plan::query()->create([
'code' => 'po_show_disable_sync_refund_inconsistent_plan',
'name' => '同步订阅禁用-退款不一致测试套餐',
'billing_cycle' => 'monthly',
'price' => 10,
'list_price' => 10,
'status' => 'active',
'sort' => 10,
'published_at' => now(),
]);
// 已支付+已生效,且 payment_status!=refunded但退款总额 >= 已付 + 容差 => refund_inconsistent=true
$order = PlatformOrder::query()->create([
'merchant_id' => $merchant->id,
'plan_id' => $plan->id,
'order_no' => 'PO_SHOW_DISABLE_SYNC_REFUND_INCONS_0001',
'order_type' => 'new_purchase',
'status' => 'activated',
'payment_status' => 'paid',
'plan_name' => $plan->name,
'billing_cycle' => $plan->billing_cycle,
'period_months' => 1,
'quantity' => 1,
'payable_amount' => 10,
'paid_amount' => 10,
'placed_at' => now(),
'paid_at' => now(),
'activated_at' => now(),
'meta' => [
'refund_summary' => [
'count' => 1,
'total_amount' => 10.01,
],
'refund_receipts' => [
[
'type' => 'refund',
'channel' => 'offline',
'amount' => 10.01,
'refunded_at' => now()->toDateTimeString(),
'created_at' => now()->toDateTimeString(),
'admin_id' => 1,
],
],
],
]);
$res = $this->get('/admin/platform-orders/' . $order->id);
$res->assertOk();
$res->assertSee('同步订阅治理提示', false);
$res->assertSee('去核对退款', false);
$res->assertSee('disabled', false);
$html = (string) $res->getContent();
preg_match_all('/href="([^"]+)"/', $html, $m);
$hrefs = $m[1] ?? [];
$links = array_values(array_filter($hrefs, fn ($u) => str_starts_with($u, '/admin/platform-orders/' . $order->id) && str_contains($u, '#refund-receipts')));
$this->assertGreaterThanOrEqual(1, count($links), '未找到指向 #refund-receipts 的治理链接');
$parts = parse_url($links[0]);
$this->assertSame('/admin/platform-orders/' . $order->id, $parts['path'] ?? '');
$this->assertSame('refund-receipts', $parts['fragment'] ?? '');
}
}